在避免使用for循环的情况下,用一个字典扩展另一个字典的最佳方法是什么?例如:
>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}
结果:
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
喜欢的东西:
a.extend(b) # This does not work
在避免使用for循环的情况下,用一个字典扩展另一个字典的最佳方法是什么?例如:
>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}
结果:
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
喜欢的东西:
a.extend(b) # This does not work
当前回答
正如其他人所提到的,对于一些字典a和b, a.update(b)将实现您在问题中要求的结果。然而,我想指出的是,我多次看到映射/set对象的extend方法希望在a.c extend(b)语法中,a的值不应该被b的值覆盖。a.update(b)会覆盖a的值,因此对于extend来说不是一个好的选择。
请注意,有些语言将此方法称为defaults或inject,因为它可以被认为是将b的值(可能是一组默认值)注入到字典中的一种方式,而不会覆盖可能已经存在的值。
当然,您可以简单地注意到a.extend(b)与b.update(a)几乎相同;a = b。要删除赋值,你可以这样做:
def extend(a,b):
"""Create a new dictionary with a's properties extended by b,
without overwriting.
>>> extend({'a':1,'b':2},{'b':3,'c':4})
{'a': 1, 'c': 4, 'b': 2}
"""
return dict(b,**a)
感谢Tom Leys的聪明想法,使用副作用少的字典构造函数进行扩展。
其他回答
你试过使用字典映射的字典理解吗?
a = {'a': 1, 'b': 2}
b = {'c': 3, 'd': 4}
c = {**a, **b}
# c = {"a": 1, "b": 2, "c": 3, "d": 4}
另一种方法是使用dict(iterable, **kwarg)
c = dict(a, **b)
# c = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
在Python 3.9中,您可以使用联合|操作符添加两个字典
# use the merging operator |
c = a | b
# c = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
就效率而言,与更新方法相比,使用解包操作似乎更快。
这是我做的一个测试的图片:
a.update(b)
最新的Python标准库文档
a.update(b)
将从b到a添加键和值,如果键已经有值,则覆盖。
你也可以使用python的集合。ChainMap是在python 3.3中引入的。
from collections import ChainMap
c = ChainMap(a, b)
c['a'] # returns 1
这有一些可能的优势,这取决于您的用例。它们在这里有更详细的解释,但我将给出简要的概述:
链图只使用字典的视图,因此实际上不会复制任何数据。这将导致更快的链接(但更慢的查找) 没有键实际上被覆盖,因此,如果有必要,您可以知道数据是来自a还是b。
这主要使它对配置字典之类的事情有用。