如何在不覆盖的情况下合并两个字典

4
我有两个字典,我想把它们合并。
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规范的方法?


如果dict2中的'abc'的值不是一个字典,那么输出会是什么? - Dani Mesejo
1
当两个字典中具有不同类型值的元素位于相同的键下时,您的合并应该如何处理? - oo00oo00oo00
@Tino:后者应该覆盖前者,好问题。 - Daniel Huckson
@RaySteam:如果dict2 = {'abc': 100},我希望得到{'abc': 100},如果它们是字典,则合并。 - Daniel Huckson
@ Alexander Cécile:我已经创建了一个缓存模块,需要实时更新,我不知道任何时候将添加到缓存中的内容,因此缓存必须能够执行CRUD操作。如果您有兴趣,请查看一下我的缓存模块。如果有更好的方法,请告诉我。 https://pastebin.com/E1Wk22Cs - Daniel Huckson
显示剩余2条评论
3个回答

4

如果我理解得正确,你可以按照以下步骤操作:

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}

0

你有一个字典嵌套在另一个字典中,你想要更新内部字典与另一个字典的内部字典相同。因此,你需要对内部字典应用更新方法:

dict1["abc"].update(dict2["abc"])

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接