Подтвердить что ты не робот

"Добавление" словарей в Python?

Возможный дубликат:
python dict.add_by_value (dict_2)?

Мой ввод - два словаря, которые имеют строковые ключи и целочисленные значения. Я хочу добавить два словаря, чтобы результат имел все ключи входных словарей, а значения - это сумма значений входных словарей.

Для ясности, если ключ отображается только на одном из входов, этот ключ/значение появится в результате, тогда как если ключ появится в обоих словарях, сумма результатов появится в результате.

Например, скажем, что мой вход:

a = dict()
a['cat'] = 1
a['fish'] = 10
a['aardvark'] = 1000

b = dict()
b['cat'] = 2
b['dog'] = 200
b['aardvark'] = 2000

Я хотел бы получить результат:

{'cat': 3, 'fish': 10, 'dog': 200, 'aardvark': 3000}

Знание Python должно быть однострочным, чтобы это сделать (на самом деле это не обязательно должна быть одна строка...). Любые мысли?

4b9b3361

Ответ 1

Как насчет этого:

dict( [ (n, a.get(n, 0)+b.get(n, 0)) for n in set(a)|set(b) ] )

Или без создания промежуточного списка (достаточно генератора):

dict( (n, a.get(n, 0)+b.get(n, 0)) for n in set(a)|set(b) )

Post Scriptum:

Как комментатор правильно адресован, есть способ реализовать это проще с новым (из Py2.7) collection.Counter. Насколько я помню, эта версия не была доступна, когда я написал ответ:

from collections import Counter
dict(Counter(a)+Counter(b))

Ответ 2

результат a:

for elem in b:
    a[elem] = a.get(elem, 0) + b[elem]

привести к c:

c = dict(a)
for elem in b:
    c[elem] = a.get(elem, 0) + b[elem]

Ответ 3

Не в одной строке, но...

import itertools
import collections
a = dict()
a['cat'] = 1
a['fish'] = 10
a['aardvark'] = 1000
b = dict()
b['cat'] = 2
b['dog'] = 200
b['aardvark'] = 2000
c = collections.defaultdict(int)
for k, v in itertools.chain(a.iteritems(), b.iteritems()):
    c[k] += v

Вы можете легко расширить его до большего количества словарей.

Ответ 4

Один лайнер (как запрошенный sort): получите списки ключей, добавьте их, отбросьте дубликаты, перечислите результат с помощью списка, пары return (key, value) для суммы, если ключ находится в обоих dicts, или только в отдельном если нет. Оберните в dict.

>>> dict([(x,a[x]+b[x]) if (x in a and x in b) else (x,a[x]) if (x in a) else (x,b[x]) for x in set(a.keys()+b.keys())])
{'aardvark': 3000, 'fish': 10, 'dog': 200, 'cat': 3}