在保留原始字典的同时合并两个字典

Sim*_*ity 10 python merge dictionary

在Python中,当我使用update()方法合并两个字典时,任何现有的键都将被覆盖.

有没有办法合并两个字典,同时保持合并结果中的原始键?

更新

假设我们有以下示例:

dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}
Run Code Online (Sandbox Code Playgroud)

我们可以合并两个词典,这样结果将保留键的两个值bookC吗?

我想dict3看起来像这样:

{'bookA': 1, 'bookB': 2, 'bookC': (2,3), 'bookD': 4, 'bookE': 5}
Run Code Online (Sandbox Code Playgroud)

Bah*_*rom 11

如果将所有值保留为列表(我更喜欢它,只是在您的值数据类型不一致时会增加额外的头痛和逻辑),您可以使用以下方法为您的更新示例使用 defaultdict

from itertools import chain
from collections import defaultdict

d1 = {'a': 1, 'b': 2, 'c': 3}
d2 = {'a': 2, 'b': 3, 'd': 4}

d3 = defaultdict(list)

for k, v in chain(d1.items(), d2.items()):
    d3[k].append(v)

for k, v in d3.items():
    print(k, v)
Run Code Online (Sandbox Code Playgroud)

打印:

a [1, 2]
d [4]
c [3]
b [2, 3]
Run Code Online (Sandbox Code Playgroud)

您还有以下方法,我发现它的可读性稍差:

d1 = {'a': 1, 'b': 2, 'c': 3}
d2 = {'a': 2, 'b': 3,}

d3 = dict((k, [v] + ([d2[k]] if k in d2 else [])) for (k, v) in d1.items())

print(d3)
Run Code Online (Sandbox Code Playgroud)

这不会修改任何原始词典并打印:

{'b': [2, 3], 'c': [3], 'a': [1, 2]}
Run Code Online (Sandbox Code Playgroud)