2013-03-28 2 views
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

+0

@Bakuriu: Я думаю, что оба они разные - первый не делает арифметику Counter-like, а второй, похоже, не имеет в виду потерю ключей с нулевыми значениями. (Что на самом деле меня удивляет - до сегодняшнего дня я никогда не знал, что объекты «Counter» сбросили нулевые ключи при выполнении арифметики.) – DSM

+0

[Здесь] (http://hg.python.org/cpython/file/ 2.7/Lib/collections.py # l598) соответствующую строку. – sloth

ответ

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} 
>>> 
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} 
+0

Не работает, потому что OP имеет python 2.6 – jamylak

+0

Также 'Counter' * уже * реализует' __add__' то, как хочет OP. – Bakuriu

+0

Я вижу, что причина этого заключалась в том, чтобы разрешить существование '0: 0', но поскольку OP имеет python 2.6, он не будет работать – jamylak

3

С очень большинства стандартных питона функций и библиотек:

dlst = [d1, d2, d3] 
for i in dlst: 
    for x,y in i.items(): 
     n[x] = n.get(x, 0)+y 

Вместо использования if-else с использованием dict.get со значением по умолчанию 0 прост и прост.

+0

+1. Я всегда забываю о 'get()' – sloth

+0

Это * может * быть немного быстрее, чем использование 'defaultdict', но iw было бы настолько маленьким и совершенно невежественным. – FallenAngel

Смежные вопросы