Python“扩展”为字典

时间:2009-02-23 10:59:33

标签: python dictionary

哪个是用另一个字典扩展字典的最佳方法?例如:

>>> 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

7 个答案:

答案 0 :(得分:594)

答案 1 :(得分:165)

this closed question中的一颗美丽宝石:

“oneliner方式”,不改变任何输入词,是

basket = dict(basket_one, **basket_two)

了解**basket_two (the **) means here

如果发生冲突,basket_two中的项目将覆盖basket_one中的项目。作为单行人员,这是非常可读和透明的,并且我没有任何强制反对使用它的任何时候一个混合的两个其他人派上用场(任何难以理解它的读者实际上将得到很好的服务这会促使他或她学习dict**形式;-)。因此,例如,使用如下:

x = mungesomedict(dict(adict, **anotherdict))

在我的代码中经常出现。

最初由Alex Martelli

提交

注意:在Python 3中,只有当basket_two中的每个键都是string时才会有效。

答案 2 :(得分:25)

您是否尝试过将字典理解与字典映射一起使用

c = {**a, **b}
# c = { "a" : 1, "b" : 2, "c" : 3, "d" : 4 }

答案 3 :(得分:23)

a.update(b)

b 中的键和值添加到 a ,如果已经存在键的值,则覆盖。

答案 4 :(得分:17)

正如其他人所提到的,某些词组a.update(b)a的{​​{1}}将达到您在问题中要求的结果。但是,我想指出,我已经多次看到映射/设置对象的b方法希望在语法extend中,a.extend(b)的值不应被{覆盖{ {1}}的价值观。 a会覆盖b的值,因此a.update(b)不是一个好的选择。

请注意,有些语言会调用此方法aextend,因为它可以被认为是将b的值(可能是一组默认值)注入到字典中的一种方法覆盖可能已经存在的值。

当然,您可以简单地注意到defaultsinject几乎相同。要删除作业,您可以这样做:

a.extend(b)

感谢Tom Leys为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) 构造函数的聪明主意。

答案 5 :(得分:0)

您还可以使用在Python 3.3中引入的python的collections.Chainmap

from collections import Chainmap
c = Chainmap(a, b)
c['a'] # returns 1

根据您的用例,这有一些可能的优点。 here对其进行了更详细的说明,但我将做一个简要概述:

  • 链图仅使用词典的视图,因此实际上没有数据被复制。这样可以加快链接速度(但查找速度较慢)
  • 实际上没有键被覆盖,因此,如有必要,您可以知道数据是来自a还是来自b。

这主要使它对于诸如配置字典之类的事情有用。

答案 6 :(得分:0)

如果您需要它作为 Class ,则可以使用 dict 对其进行扩展,并使用 update 方法:

Class a(dict):
  # some stuff
  self.update(b)