Рекурсивное обновление словарей
Имеются два словаря, разного уровня вложенности:
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