我有两个现有的字典,我希望将其中一个“附加”到另一个。我的意思是,另一个字典的键值应该被放到第一个字典中。例如:
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)
或者,如果你不想修改原始文件,请先复制一份:
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)。
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}