Python“扩展”为一个字典
哪一个是用另一个扩展字典的最好方法? 例如:
>>> 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
a.update(b)
Python标准库文档
在这个封闭的问题中一个美丽的gem:
改变input字典的“在线方式”是
basket = dict(basket_one, **basket_two)
了解**basket_two
( **
)的含义 。
如果发生冲突, basket_two
的项目将覆盖basket_one
。 作为单行者,这是非常可读和透明的,我没有反对使用它的任何时候,这是一个混合了另外两个字母派上用场(任何读者谁不理解它实际上会很好地服务于这促使他或她学习dict
和**
表格;-)。 所以,例如,使用像:
x = mungesomedict(dict(adict, **anotherdict))
在我的代码中是相当常见的事件。
最初由Alex Martelli提交
注意:在Python 3中,只有在basket_two中的每个键都是string
才能使用。
a.update(b)
将键和值从b添加到a ,如果已经有键的值,则覆盖。
正如其他人所提到的, a.update(b)
对于某些字符a
和b
将会达到您在问题中所要求的结果。 然而,我想指出,很多时候我已经看到映射/设置对象的extend
方法希望在语法a.extend(b)
, a
的值不应该被b
的值所覆盖。 a.update(b)
覆盖a
值,所以不是extend
的好select。
请注意,有些语言称这种方法为defaults
或inject
,因为它可以被认为是一种将b的值(可能是一组默认值)注入字典而不覆盖可能已经存在的值的方法。
当然,你可以简单地注意到a.extend(b)
几乎是一样b.update(a); a=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
。