我有两个现有的字典,我希望将其中一个“附加”到另一个。我的意思是,另一个字典的键值应该被放到第一个字典中。例如:
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) # 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
警告
注意,这些运算是非交换的。在所有情况下,后者都是赢家。如。
{'A': 1, 'B': 2}
extra = {'A': 3, 'C': 3}
Dest = orig | extra
# dest = {'A': 3, 'B': 2, 'C': 3}
Dest = extra | origin
# dest = {'A': 1, 'B': 2, 'C': 3}
同样重要的是要注意,只有从Python 3.7(和CPython 3.6)字典是有序的。因此,在以前的版本中,字典中条目的顺序可能会有所不同。
将一个字典添加到另一个字典中有两种方法:
更新(就地修改原始版本)
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
警告
注意,这些运算是非交换的。在所有情况下,后者都是赢家。如。
{'A': 1, 'B': 2}
extra = {'A': 3, 'C': 3}
Dest = orig | extra
# dest = {'A': 3, 'B': 2, 'C': 3}
Dest = extra | origin
# dest = {'A': 1, 'B': 2, 'C': 3}
同样重要的是要注意,只有从Python 3.7(和CPython 3.6)字典是有序的。因此,在以前的版本中,字典中条目的顺序可能会有所不同。
假设你不想改变org,你可以像其他答案一样进行复制和更新,或者你可以通过将两个字典中的所有项传递到dict构造函数中,一步创建一个新字典:
from itertools import chain
dest = dict(chain(orig.items(), extra.items()))
或者不使用itertools:
dest = dict(list(orig.items()) + list(extra.items()))
注意,在Python 3上,你只需要将items()的结果传递给list(),在Python 2上。X dict.items()已经返回了一个列表,因此您只需执行dict(origin .items() + extra.items())。
作为一个更一般的用例,假设你有一个更大的字典列表,你想要合并成一个字典,你可以这样做:
from itertools import chain
dest = dict(chain.from_iterable(map(dict.items, list_of_dicts)))
你可以这样做
orig.update(extra)
或者,如果你不想修改原始文件,请先复制一份:
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}
我想给出的答案是“使用集合”。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)。