如何在Python中将字典合并在一起?

TIM*_*MEX 84 python dictionary

d3 = dict(d1, **d2)
Run Code Online (Sandbox Code Playgroud)

我明白这会合并字典.但是,它有独特之处吗?如果d1与d2具有相同的键但值不同,该怎么办?我希望合并d1和d2,但如果有重复键,则d1具有优先权.

Fel*_*ing 148

.update()如果您不再需要原始文件,则可以使用该方法d2:

使用其他键中的键/值对更新字典,覆盖现有键.返回None.

例如:

>>> d1 = {'a': 1, 'b': 2} 
>>> d2 = {'b': 1, 'c': 3}
>>> d2.update(d1)
>>> d2
{'a': 1, 'c': 3, 'b': 2}
Run Code Online (Sandbox Code Playgroud)

更新:

当然,您可以先复制字典,以创建新的合并字典.这可能是也可能不是必要的.如果你的词典中有复合对象(包含其他对象的对象,如列表或类实例),copy.deepcopy也应该考虑.

  • d1 + d2是有问题的,因为一个字典在冲突期间必须具有优先权,并且哪一个不是特别明显. (4认同)
  • 在这种情况下,如果发现冲突的键,d1 元素应该正确获得优先级 (2认同)

unu*_*tbu 40

在Python2中,

d1={'a':1,'b':2}
d2={'a':10,'c':3}
Run Code Online (Sandbox Code Playgroud)

d1覆盖d2:

dict(d2,**d1)
# {'a': 1, 'c': 3, 'b': 2}
Run Code Online (Sandbox Code Playgroud)

d2覆盖d1:

dict(d1,**d2)
# {'a': 10, 'c': 3, 'b': 2}
Run Code Online (Sandbox Code Playgroud)

这种行为不仅仅是一个实施的侥幸; 它在文档中得到保证:

如果在位置参数和关键字参数中都指定了键,则与该关键字关联的值将保留在字典中.

  • 您的示例将在Python 3.2中失败(产生TypeError),并且在当前版本的Jython,PyPy和IronPython中:对于那些版本的Python,当使用`**'表示法传递dict时,该dict的所有键应该是字符串.有关更多信息,请参阅http://mail.python.org/pipermail/python-dev/2010-April/099427.html上的python-dev线程. (3认同)
  • 如果你的密钥是字符串和数字的元组,它就会失败.例如.d1 = {(1,'a'):1,(1,'b'):0,} d2 = {(1,'a'):1,(2,'b'):2,(2, 'A'):1,} (3认同)

Xav*_*hot 23

从 开始Python 3.9,运算符|使用两个字典中合并的键和值创建一个新字典:

\n\n
# d1 = { \'a\': 1, \'b\': 2 }\n# d2 = { \'b\': 1, \'c\': 3 }\nd3 = d2 | d1\n# d3: {\'b\': 2, \'c\': 3, \'a\': 1}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这:

\n\n
\n

使用 d2 和 d1 的合并键和值创建一个新字典 d3。当 d2 和 d1 共享密钥时,d1 的值优先。

\n
\n\n
\n\n

另请注意|=通过合并 d1 来修改 d2 的运算符,优先级为 d1 值:

\n\n
# d1 = { \'a\': 1, \'b\': 2 }\n# d2 = { \'b\': 1, \'c\': 3 }\nd2 |= d1\n# d2: {\'b\': 2, \'c\': 3, \'a\': 1}\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa8

\n


tzo*_*zot 14

如果您想d1在冲突中拥有优先权,请执行以下操作:

d3 = d2.copy()
d3.update(d1)
Run Code Online (Sandbox Code Playgroud)

否则,反向d2d1.