如何合并两个字典而不会造成混乱

时间:2019-12-01 21:33:59

标签: python

我有两个字典,我想将它们合并。

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方式来做到这一点?

3 个答案:

答案 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}}