Is there any pythonic way to combine two dicts (adding values for keys that appear in both)?
Use collections.Counter
:
>>> from collections import Counter>>> A = Counter({'a':1, 'b':2, 'c':3})>>> B = Counter({'b':3, 'c':4, 'd':5})>>> A + BCounter({'c': 7, 'b': 5, 'd': 5, 'a': 1})
Counters are basically a subclass of dict
, so you can still do everything else with them you'd normally do with that type, such as iterate over their keys and values.
A more generic solution, which works for non-numeric values as well:
a = {'a': 'foo', 'b':'bar', 'c': 'baz'}b = {'a': 'spam', 'c':'ham', 'x': 'blah'}r = dict(a.items() + b.items() + [(k, a[k] + b[k]) for k in set(b) & set(a)])
or even more generic:
def combine_dicts(a, b, op=operator.add): return dict(a.items() + b.items() + [(k, op(a[k], b[k])) for k in set(b) & set(a)])
For example:
>>> a = {'a': 2, 'b':3, 'c':4}>>> b = {'a': 5, 'c':6, 'x':7}>>> import operator>>> print combine_dicts(a, b, operator.mul){'a': 10, 'x': 7, 'c': 24, 'b': 3}
>>> A = {'a':1, 'b':2, 'c':3}>>> B = {'b':3, 'c':4, 'd':5}>>> c = {x: A.get(x, 0) + B.get(x, 0) for x in set(A).union(B)}>>> print(c){'a': 1, 'c': 7, 'b': 5, 'd': 5}