哪个是用另一个字典扩展字典的最佳方法?例如:
>>> a = { "a" : 1, "b" : 2 } >>> b = { "c" : 3, "d" : 4 } >>> a {'a': 1, 'b': 2} >>> b {'c': 3, 'd': 4}
我正在寻找任何操作来获得这个避免for
循环:
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
我希望做的事情如下:
a.extend(b) # This does not work
Nick Fortesc.. 638
a.update(b)
最新的Python标准库文档
a.update(b)
最新的Python标准库文档
这个封闭的问题是一个美丽的宝石:
"oneliner方式",既不改变输入词,也是
basket = dict(basket_one, **basket_two)
了解什么是**basket_two
(在**
)指这里.
如果发生冲突,项目basket_two
将覆盖来自的项目basket_one
.作为单行人员,这是非常可读和透明的,并且我没有任何强制反对使用它的任何时候一个混合的两个其他人派上用场(任何难以理解它的读者实际上将得到很好的服务这促使他或她学习dict
和**
形式的方式;-).因此,例如,使用如下:
x = mungesomedict(dict(adict, **anotherdict))
在我的代码中经常发生.
最初由Alex Martelli提交
注意:在Python 3中,只有当basket_two中的每个键都是a时才会有效string
.
您是否尝试过使用字典映射的字典理解:
c = {**a, **b} # c = { "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
a.update(b)
将b中的键和值添加到a,如果已经存在键的值,则覆盖.
正如其他人所提到的那样,a.update(b)
对于一些决定而言a
,b
你将在你的问题中找到你所要求的结果.但是,我想指出,我已经多次看到extend
映射/设置对象的方法希望在语法中a.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使用无副作用dict
构造函数的聪明想法extend
.