Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并两个词典,同时保留原始词典_Python_Dictionary_Merge - Fatal编程技术网

Python 合并两个词典,同时保留原始词典

Python 合并两个词典,同时保留原始词典,python,dictionary,merge,Python,Dictionary,Merge,在Python中,当我使用该方法合并两个字典时,任何现有键都将被覆盖 有没有一种方法可以合并两个词典,同时在合并结果中保留原始关键字 更新 假设我们有以下例子: dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3} dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5} 我们是否可以合并这两个字典,以便结果将保留键bookC的两个值 我想让dict3看起来像这样: {'bookA': 1, 'bookB': 2, 'book

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

有没有一种方法可以合并两个词典,同时在合并结果中保留原始关键字

更新

假设我们有以下例子:

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


更新问题后,如果可以将所有值保留为一个列表,我同意BAH使用带有列表的defaultdict的实现(我更愿意,当值数据类型不一致时,它只会增加额外的麻烦和逻辑),您可以使用
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]}
输出:
{'c':3,'d':2,'e':3,'b':2,'a':(1,10)}

还有另一种方法可以将所有值保持为一个列表,而不是使用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与键k相加。
如果出现KeyError,d3将接受新密钥。

您能给出一个与输入/输出相关的示例吗?您希望两个dicts中的键发生什么情况?@BAH谢谢,添加了一个示例您不能让字典包含两个相同值的键。密钥必须是唯一的。我会质疑外部代码的用途,以及字典是否是存储所需数据的正确对象?“我们是否可以合并两个字典,以便结果将保留键bookC的两个值?”好的,但它没有回答当前的问题。有时,编辑问题会使答案无效。应该更改或删除该答案。d2中不在d1中的元素如何?通过上面的实现,他们能到达d3吗?@EduardoCMB你是对的,他们不会,当他更新他的问题时,我意识到了这一点。查看编辑后的答案,使用
defaultdict
这正是我刚才写的东西-但是
*zip
调用是多余的。也只需使用
d3[k]。附加(v)
@简单,无需担心,很高兴能提供帮助:)一行怎么样?输出应该有
a
b
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]}