将字典附加到字典中

我有两个现有的字典,我希望将其中一个“附加”到另一个。我的意思是,另一个字典的键值应该被放到第一个字典中。例如:

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循环来实现(也许?),但是否有一些字典方法或任何其他模块为我保存这项工作?我用的字典真的很大……

865113 次浏览

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()方法:)

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

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

在2.4版更改:允许实参是键/值对的可迭代对象,并允许关键字实参。

你可以这样做

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}

假设你不想改变orig,你可以像其他答案一样进行复制和更新,或者你可以通过将两个字典中的所有项传递到dict构造函数中,一步创建一个新字典:

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

或者不使用itertools:

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

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

作为一个更一般的用例,假设你有一个更大的字典列表,你想要合并成一个字典,你可以这样做:

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

我想给出的答案是“使用集合”。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

下面是一个不太完整的Python 2。x兼容版本(同一作者):http://code.activestate.com/recipes/305268-chained-map-lookups/

而不是用dict扩展/覆盖一个字典。合并,或创建一个合并两者的附加副本,您将创建一个按顺序搜索两者的查找链。因为它不复制映射,所以它只使用很少的内存,并且可以看到后续对任何子映射的修改。因为顺序很重要,你也可以使用链来分层默认值(即user prefs > config > env)。

将一个字典添加到另一个字典中有两种方法:

更新(就地修改orig)

orig.update(extra)    # Python 2.7+
orig |= extra         # Python 3.9+

合并(创建一个新字典)

# Python 2.7+
dest = collections.ChainMap(orig, extra)
dest = {k: v for d in (orig, extra) for (k, v) in d.items()}


# Python 3
dest = {**orig, **extra}
dest = {**orig, 'D': 4, 'E': 5}


# Python 3.9+
dest = orig | extra

警告

注意,这些运算是非交换的。在所有情况下,后者是赢家。如。

orig  = {'A': 1, 'B': 2}
extra = {'A': 3, 'C': 3}


dest = orig | extra
# dest = {'A': 3, 'B': 2, 'C': 3}


dest = extra | orig
# dest = {'A': 1, 'B': 2, 'C': 3}

同样重要的是要注意,只有在Python 3.7(和CPython 3.6)中才会排序__abc0。因此,在以前的版本中,字典中条目的顺序可能会有所不同。

组合或合并两个字典的三行代码:

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

这将创建一个新字典dest,而不修改origextra

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