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
,这对于字典 a
和 b
都是通用的,用字典 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'}}
我需要合并两个词典(多级),它们(以非常简化的形式)像
a = {'a' : {'b' : '1'}}
b = {'a' : {'c' : '2'}}
结果应该是
x = {'a' : {'b: '1', 'c' : '2' }}
Python (3.9) 是否提供以所需方式合并它们的功能? 或者这可以在故障保存过程中完成吗?
实际数据多了几个level,长度不一样
提前致谢。
你的问题太含糊了,你所说的“多级”是什么意思,因为你没有提供例子。但是对于您显示的内容,以下内容将针对每个键 key
,这对于字典 a
和 b
都是通用的,用字典 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'}}