将字典附加到字典?

我有两本现有的字典,我希望将其中一个附加到另一个。 我的意思是说,其他字典的关键,价值应该成为第一个字典。 例如:

orig = { 'A': 1, 'B': 2, 'C': 3, } extra = { 'D': 4, 'E': 5, } dest = # something here involving orig and extra print dest { 'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5 } 

我认为这一切都可以通过for循环(也许?)来实现,但有没有一些字典或任何其他模块的方法,为我保存这份工作? 我用的实际字典真的很大

你可以做

 orig.update(extra) 

或者,如果您不希望修改orig ,请先复印一份:

 dest = dict(orig) # or orig.copy() dest.update(extra) 

请注意,如果extra和orig具有重叠的键,则最终的值将从额外的值中取出。 例如,

 >>> d1 = {1: 1, 2: 2} >>> d2 = {2: 'ha!', 3: 3} >>> d1.update(d2) >>> d1 {1: 1, 2: 'ha!', 3: 3} 

假设您不想更改orig ,您可以像其他答案一样进行复制和更新,也可以通过将来自两个字典的所有项目传递给字典构造函数来一步创build新的字典:

 from itertools import chain dest = dict(chain(orig.items(), extra.items())) 

或者没有itertools:

 dest = dict(list(orig.items()) + list(extra.items())) 

请注意,您只需要在Python 3上将items()的结果传递给list() ,在2.x dict.items()已经返回一个列表,所以你可以做dict(orig.items() + extra.items())

作为一个更普遍的用例,假设你有一个更大的字典列表,你可以像这样做:

 from itertools import chain dest = dict(chain.from_iterable(map(dict.items, list_of_dicts))) 

最pythonic(和稍快)的方式来完成这个是通过:

 dest = {**orig, **extra} 

或者,根据要解决的问题,也许:

 dest = {**orig, 'D': 4, 'E': 5} 

dict.update()看起来像它会做你想要的…

 >> orig.update(extra) >>> orig {'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4} >>> 

也许,你不想更新你的原始字典,但在副本上工作:

 >>> dest = orig.copy() >>> dest.update(extra) >>> orig {'A': 1, 'C': 3, 'B': 2} >>> dest {'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4} 

有.update()方法:)

update([other])用其他键/值对更新字典,覆盖现有的键。 返回无。

update()接受另一个字典对象或一个键/值对的迭代(作为元组或其他长度为2的迭代)。 如果指定了关键字参数,则字典随后将使用这些键/值对进行更新:d.update(red = 1,blue = 2)。

在版本2.4中更改:允许参数是键/值对的迭代并允许关键字参数。

我想给的答案是“使用collections.ChainMap”,但我刚刚发现它只是在Python 3.3中添加: https : //docs.python.org/3.3/library/collections.html#chainmap-objects

您可以尝试从3.3源代码中挑选该类 : http : //hg.python.org/cpython/file/3.3/Lib/collections/init.py#l763

这是一个function较less的Python 2.x兼容版本(同一作者): http : //code.activestate.com/recipes/305268-chained-map-lookups/

而不是使用dict.merge扩展/覆盖另一个字典,或者创build一个合并的副本,您可以创build一个按顺序search的查找链。 因为它不重复映射它包裹ChainMap使用很less的内存,并且看到后来修改任何子映射。 因为顺序很重要,所以你也可以使用链来对默认值进行分层(比如user prefs> config> env)。

一个三线结合或合并两个字典:

 dest = {} dest.update(orig) dest.update(extra) 

这创build了一个新的字典dest而不用修改origextra

注意:如果一个键在origextra有不同的值,那么extra覆盖orig