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

时间:2016-03-23 14:16:45

标签: python dictionary merge

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

4 个答案:

答案 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接受新密钥。