Рекурсивное обновление словарей

Имеются два словаря, разного уровня вложенности:

a1 = {1: {'a': 45, 'b': {'ff': 23, 'dd': 90}}}

a2 = {1:{'a': 45, 'b': {'f': 243, 'd': 90}}, 2: '23'}

Получить хочу следующее:

a3 = {1:{'a':45, 'b':{'ff': 23, 'dd': 90, 'f': 243,'d': 90}}, 2: '23'}

То есть объединить их. Что-типа d1.update(d2) или {**d1, **d2} только, чтобы учитывались также уровни вложенности. Понятно, что можно написать функцию рекурсивную. Но может есть что-нибудь поизящнее?


Ответы (1 шт):

Автор решения: gil9red

Когда-то писал алгоритм для таких целей:

def dict_merge(j1, j2):
    for k, v in j2.items():
        if k in j1 and isinstance(j1[k], dict) and isinstance(v, dict):
            dict_merge(j1[k], v)
        else:
            j1[k] = v

Проверка:

a1 = {1: {'a': 45, 'b': {'ff': 23, 'dd': 90}}}
a2 = {1: {'a': 45, 'b': {'f': 243, 'd': 90}}, 2: '23'}

a3 = {1: {'a':45, 'b':{'ff': 23, 'dd': 90, 'f': 243,'d': 90}}, 2: '23'}

dict_merge(a1, a2)
print(a1)
# {1: {'a': 45, 'b': {'ff': 23, 'dd': 90, 'f': 243, 'd': 90}}, 2: '23'}

print(a1 == a3)
# True
→ Ссылка