合并字典并添加值

4

我有几个字典,希望将它们合并,如果某个键在多个字典中出现,则将值相加。例如:

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。


1
这些都不是真正的重复。 - sloth
@Bakuriu: 我认为这两个是不同的 - 第一个不执行类似Counter的算术运算,而第二个似乎并不在意具有零值的键的丢失。(这实际上让我感到惊讶 - 直到今天我从未知道Counter对象在进行算术运算时会丢弃零值键。) - DSM
这是相关的代码行:这里 - sloth
3个回答

8

使用 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}
>>>

3

使用最常用的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

2

无需导入任何东西。

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__ - Bakuriu
我可以看出这样做的原因是为了允许0:0存在,但由于OP使用的是Python 2.6,它不起作用。 - jamylak
我已经移除了 Counter 并查看了更新后的答案。没有导入任何东西。 - namit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接