我有几个字典,希望将它们合并,如果某个键在多个字典中出现,则将值相加。例如:
d1 = {1: 10, 2: 20, 3: 30}
d2 = {1: 1, 2: 2, 3: 3}
d3 = {0: 0}
merged = {1: 11, 2: 22, 3: 33, 0: 0}
在Python中,哪种方法最好?我正在看defaultdict并尝试想出一些方法。我正在使用Python 2.6。
我有几个字典,希望将它们合并,如果某个键在多个字典中出现,则将值相加。例如:
d1 = {1: 10, 2: 20, 3: 30}
d2 = {1: 1, 2: 2, 3: 3}
d3 = {0: 0}
merged = {1: 11, 2: 22, 3: 33, 0: 0}
在Python中,哪种方法最好?我正在看defaultdict并尝试想出一些方法。我正在使用Python 2.6。
使用 defaultdict
:
>>> d = defaultdict(int)
>>> for di in [d1,d2,d3]:
... for k,v in di.items():
... d[k] += v
...
>>> dict(d)
{0: 0, 1: 11, 2: 22, 3: 33}
>>>
使用最常用的Python标准功能和库:
dlst = [d1, d2, d3]
for i in dlst:
for x,y in i.items():
n[x] = n.get(x, 0)+y
使用dict.get
并设置默认值为0
,而不是使用if-else
语句进行检查,这样更加简单易懂。
defaultdict
更快一点,但是差别很小,可以忽略不计。 - FallenAngel无需导入任何东西。
d4={}
for d in [d1,d2,d3]:
for k,v in d.items():
d4.setdefault(k,0)
d4[k]+=v
print d4
输出:
{0: 0, 1: 11, 2: 22, 3: 33}
Counter
已经按照OP的要求实现了__add__
。 - Bakuriu0:0
存在,但由于OP使用的是Python 2.6,它不起作用。 - jamylakCounter
并查看了更新后的答案。没有导入任何东西。 - namit
Counter
对象在进行算术运算时会丢弃零值键。) - DSM