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)