Python:合并多级字典(追加而不替换)

Python: Merge Multilevel dictionaries (append without replace)

我需要合并两个词典(多级),它们(以非常简化的形式)像

 a = {'a' : {'b' : '1'}}
 b = {'a' : {'c' : '2'}}

结果应该是

 x = {'a' : {'b: '1', 'c' : '2' }} 

Python (3.9) 是否提供以所需方式合并它们的功能? 或者这可以在故障保存过程中完成吗?

实际数据多了几个level,长度不一样

提前致谢。

你的问题太含糊了,你所说的“多级”是什么意思,因为你没有提供例子。但是对于您显示的内容,以下内容将针对每个键 key,这对于字典 ab 都是通用的,用字典 a[key] 更新字典 b[key]。当然,这假设键值是字典。

from copy import deepcopy

a = {'a': {'b': '1'}}
b = {'a': {'c': '2'}, 'f': {'d': '3'}}

x = deepcopy(a)
for key in b.keys():
    if key in x:
        x[key].update(b[key])
    else:
        x[key] = b[key]
print(x)

打印:

{'a': {'b': '1', 'c': '2'}, 'f': {'d': '3'}}

dict.update 方法是解决方案的关键(请原谅双关语)。如果 multilevel 你的意思是字典值是字典,其值也是字典,那么你将需要一个递归算法。

a = {'a' : {'b' : '1'}}
b = {'a' : {'c' : '2'}}

aset = set(a)
bset = set(b)

c=dict()
#first common keys
for name in aset.intersection(bset):
    c[name]=dict(a[name], **b[name])
#keys in a but not in b
for name in aset-bset:
    c[name]=a[name]
#keys in b but not in a
for name in bset-aset:
    c[name]=b[name]
#print fully merged c
print(c)
>>> {'a': {'b': '1', 'c': '2'}}

我使用集合来简化查找公用键等,你可以检查这个question

一个更完整的例子:

a = {'a' : {'b' : '1'},'e':{'l':'2'},'f':{'x':'10'}}
b = {'a' : {'c' : '2'},'e':{'i':'2'},'g':{'z':'12'}}

aset = set(a)
bset = set(b)

c=dict()
for name in aset.intersection(bset):
    c[name]=dict(a[name], **b[name])
for name in aset-bset:
    c[name]=a[name]
for name in bset-aset:
    c[name]=b[name]
print(c)
>>> {'a': {'b': '1', 'c': '2'}, 'e': {'l': '2', 'i': '2'}, 'f': {'x': '10'}, 'g': {'z': '12'}}