将字典合并

137

我有两个字典,我想将它们合成一个:

希望能够实现类似以下伪代码的Python代码:

dic0 = {'dic0': 0}
dic1 = {'dic1': 1}

ndic = dic0 + dic1
# ndic would equal {'dic0': 0, 'dic1': 1}

1
@Sam 可能的问题:{'dic0':0} + {'dic0':1}。该怎么办? - palsch
3
"@palsch {'dic0':0} + {'dic0':1} should be equivalent to d={'dic0':0}; d.update({'dic0':1}) ?"这句话的意思是:使用"@palsch {'dic0':0} + {'dic0':1}" 或 "d={'dic0':0}; d.update({'dic0':1})" 两种方法都可以得到相同的结果。其中,@palsch {'dic0':0} + {'dic0':1} 是指将两个字典{'dic0':0}和{'dic0':1}进行加法操作,它们会被合并成一个字典{'dic0':1};而"d={'dic0':0}; d.update({'dic0':1})"是先创建一个包含键值对{'dic0':0}的字典d,并将其更新为包含键值对{'dic0':1}的字典。 - Sam
2
你使用加号运算符的语法在Python 3.9中得到支持,根据PEP 584。 - MartijnVanAttekum
6个回答

210

如果您有兴趣创建一个新字典而不使用中介存储:(这比使用dict.items()更快,更干净,是我的看法)

dic2 = dict(dic0, **dic1)

或者如果你愿意使用现有的字典之一:

dic0.update(dic1)

19
好的回答,但是不够直观。我希望“+”被实现... - Berry Tsakala
3
不是很可靠:https://dev59.com/mXE85IYBdhLWcg3wYigB#2799082 - 0 _
9
如果键不是字符串,第一行代码将失败。 - Flimm
2
@BerryTsakala + 的问题在于冲突的情况下会发生什么?.update() 是正确的非对称方式。 - Nikana Reklawyks
7
@BerryTsakala,你的愿望在Python 3.9中得以实现:) 但操作符是“|”,而不是“+”。https://docs.python.org/3/whatsnew/3.9.html - Nate Glenn
显示剩余2条评论

47

这里有很多种方法来添加字典。

你可以使用Python3的字典解包特性:

ndic = {**dic0, **dic1}

请注意,在重复的情况下,将使用后面参数中的值。其他示例也是如此。


或者通过添加这两个项来创建一个新字典。

ndic = dict(tuple(dic0.items()) + tuple(dic1.items()))

如果修改 dic0 是可以的:

dic0.update(dic1)

如果修改dic0不可以,请执行以下操作:

ndic = dic0.copy()
ndic.update(dic1)
如果确保一个字典中的所有键都是字符串(在这种情况下是dic1,当然参数可以交换)
ndic = dict(dic0, **dic1)

在某些情况下,使用字典推导式(Python 2.7或更新版本)可能会很方便,特别是如果您想同时过滤或转换一些键/值。

ndic = {k: v for d in (dic0, dic1) for k, v in d.items()}

18
>>> dic0 = {'dic0':0}
>>> dic1 = {'dic1':1}
>>> ndic = dict(list(dic0.items()) + list(dic1.items()))
>>> ndic
{'dic0': 0, 'dic1': 1}
>>>

2
иҜ·жіЁж„ҸпјҢеңЁPython 3.xдёӯпјҢзӣёеә”зҡ„иҜӯжі•дёәndic = list(dict(dic0.items()) + list(dic1.items()))пјҢеӣ дёә.items()дёҚеҶҚиҝ”еӣһеҲ—иЎЁпјҢиҖҢжҳҜдёҖдёӘпјҲеҸҜиҝӯд»Јпјүи§ҶеӣҫгҖӮ - Bryce Guinta
3
@BryceGuinta 我猜你是指ndic=dict(list(dic0.items()) + list(dic1.items())) - dimo414
1
@dimo414 是的,我的错。但我现在无法更改它。我现在使用collections中的ChainMap通过dict(ChainMap(dic1, dic0))实现此功能。但是,我不得不从chainmap pypi包中获取Python2.7的源代码。请注意,我已经交换了字典的顺序。在Vijay的示例中,最右边的键值会覆盖最左边的键值,而ChainMap则正确地获取最左边的键值,并具有优先权。 - Bryce Guinta

13
你正在寻找“update method”更新方法的相关文档,请查看映射类型 - 字典 (dict)
dic0.update( dic1 )
print( dic0 ) 

提供

{'dic0': 0, 'dic1': 1}

8
好的,虽然它修改了dic0,但我不确定原始发布者是否接受这种修改。 - mseery

7
dic0.update(dic1)

请注意,这并不会返回合并后的字典,它只是改变了dic0的值。


5
最简单的方法是直接使用您的示例代码,但是使用每个字典的items()成员。因此,代码如下所示:
dic0 = {'dic0': 0}
dic1 = {'dic1': 1}
dic2 = dict(dic0.items() + dic1.items())

我在IDLE上测试过,它可以正常工作。 然而,关于这个主题的前一个问题指出,这种方法很慢并且会消耗内存。那里推荐了几种其他的方式,因此如果内存使用很重要,请参见该方法。


3
这会创建一个元组列表,你需要运行dict(dic0.items() + dic1.items()) - bluepnume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接