将字典附加到字典?

时间:2012-01-19 17:55:49

标签: python dictionary

我有两个现有的词典,我希望将其中一个词典“追加”到另一个词典中。我的意思是,其他字典的关键值应该被制作成第一个字典。例如:

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循环(也许是?)实现,但是有一些字典方法或任何其他模块可以为我保存这份工作吗?我正在使用的实际词典真的很大......

7 个答案:

答案 0 :(得分:412)

你可以做到

orig.update(extra)

或者,如果您不想修改orig,请先复制一份:

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

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

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

答案 1 :(得分:52)

实现这一目标的最pythonic(并且稍微快一点)的方法是:

dest = {**orig, **extra}

或者,根据要解决的问题,可能:

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

答案 2 :(得分:24)

假设您不想更改orig,您可以像其他答案一样进行复制和更新,也可以通过将所有项目从两个词典传递到词典中来一步创建新词典构造:

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

或没有itertools:

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

请注意,您只需要在{3}上将items()的结果传递给list(),在2.x dict.items()已经返回一个列表,这样您就可以{{1} }。

作为一个更通用的用例,假设你有一个更大的dicts列表,你想要组合成一个单独的dict,你可以做这样的事情:

dict(orig.items() + extra.items())

答案 3 :(得分:17)

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}

答案 4 :(得分:7)

有.update()方法:)

  

<强>更新([其他])   使用其他键中的键/值对更新字典,覆盖现有键。返回无。

     

update()接受另一个字典对象或一对键/值对的迭代(作为元组或长度为2的其他迭代)。如果   指定了关键字参数,然后使用更新字典   那些键/值对:d.update(红色= 1,蓝色= 2)。

     

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

答案 5 :(得分:7)

我想给出的答案是&#34;使用collections.ChainMap&#34;,但我刚发现它只是在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

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

不是使用dict.merge扩展/覆盖另一个字典,也不创建合并两者的附加副本,而是创建一个按顺序搜索的查找链。因为它不会复制它所包含的映射,所以ChainMap使用的内存非常少,并且可以看到以后对任何子映射的修改。由于订单很重要,您还可以使用链来分层默认值(即用户首选项&gt; config&gt; env)。

答案 6 :(得分:2)

用于组合或合并两个词典的三线程:

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

这会创建一个新词典dest,而不会修改origextra

注意:如果某个键在origextra中的值不同,则extra会覆盖orig