我有两个字典,我想将它们合并。
dict1 = {'abc': {'test1': 123}}
dict2 = {'abc': {'test2': 456}}
我想结束
{'abc': {'test1': 123, 'test2': 456}}
如果dict2 = {'abc': 100}
,那么我想要:
{'abc' 100}
我尝试了dict1.update(dict2)
,但这给了我{'abc': {'test2': 456}}
有没有一种Python方式来做到这一点?
答案 0 :(得分:3)
IIUC,您可以执行以下操作:
def recursive_update(d1, d2):
"""Updates recursively the dictionary values of d1"""
for key, value in d2.items():
if key in d1 and isinstance(d1[key], dict) and isinstance(value, dict):
recursive_update(d1[key], value)
else:
d1[key] = value
dict1 = {'abc': {'test1': 123}}
dict2 = {'abc': {'test2': 456}}
recursive_update(dict1, dict2)
print(dict1)
输出
{'abc': {'test1': 123, 'test2': 456}}
请注意,递归仅适用于字典值。例如:
dict1 = {'abc': {'test1': 123}}
dict2 = {'abc': 100}
产生(如预期):
{'abc': 100}
答案 1 :(得分:0)
您在词典中有一个词典,并且要用另一个词典的内部词典更新内部词典。因此,您必须将update方法应用于内部字典:
dict1["abc"].update(dict2["abc"])
答案 2 :(得分:0)
您可以将collections.defaultdict
与字典配合使用。
from collections import defaultdict
merge = defaultdict(dict)
# Handle nesting
for d in [dict1, dict2]:
for k0, v0 in d.items():
for k1, v1 in v0.items():
merge[k0][k1] = v1 # Assign to defaultdict
print(dict(merge)) # -> {'abc': {'test1': 123, 'test2': 456}}
或者您可以使用dict.setdefault
。
merge = {}
for d in [dict1, dict2]:
for k0, v0 in d.items():
merge.setdefault(k0, {})
for k1, v1 in v0.items():
merge[k0][k1] = v1
print(merge) # -> {'abc': {'test1': 123, 'test2': 456}}