在Python中,当我使用update()方法合并两个词典时,任何现有的键都将被覆盖。
有没有办法合并两个词典,同时保持原始键在合并结果中?
更新
假设我们有以下示例:
dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}
我们可以合并两个词典,这样结果会保留键bookC
的两个值吗?
我希望dict3
看起来像这样:
{'bookA': 1, 'bookB': 2, 'bookC': (2,3), 'bookD': 4, 'bookE': 5}
答案 0 :(得分:10)
如果将所有值保留为列表(我更喜欢它,只会在您的值数据类型不一致时添加额外的麻烦和逻辑),您可以使用以下方法您使用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)
打印:
a [1, 2]
d [4]
c [3]
b [2, 3]
你也有以下方法,我发现它的可读性稍差:
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)
这不会修改任何原始词典并打印:
{'b': [2, 3], 'c': [3], 'a': [1, 2]}
答案 1 :(得分:2)
a = {'a': 1, 'b': 2, 'c': 3}
b = {'a': 10, 'd': 2, 'e': 3}
b.update({key: (a[key], b[key]) for key in set(a.keys()) & set(b.keys())})
b.update({key: a[key] for key in set(a.keys()) - set(b.keys())})
print(b)
输出: {'c':3,'d':2,'e':3,'b':2,'a':( 1,10)}
答案 2 :(得分:1)
a = {'a': 1, 'b': 2, 'c': 3}
b = {'a': 10, 'd': 2, 'e': 3}
for k in b:
if k not in a:
a[k] = b[k]
<强>更新强>
在更新问题之后,我同意BAH使用带有列表的defaultdict的实现
答案 3 :(得分:1)
还有一种将所有值保留为列表的方法,该方法不使用defaultdict或chain。
修改示例:
d1 = {'a': 1, 'b': 2, 'c': 3}
d2 = {'a': 2, 'b': 3, 'd': 4}
d3 = {}
for (k, v) in list(d1.items())+list(d2.items()):
try:
d3[k] += [v]
except KeyError:
d3[k] = [v]
print(d3)
那么我们有:
{'d': [4], 'b': [2, 3], 'a': [1, 2], 'c': [3]}
try语句用于提高速度。 它尝试将键v与值v相加。 如果发生KeyError,则d3接受新密钥。