>>> from collections import Counter >>> A = Counter({'a':1, 'b':2, 'c':3}) >>> B = Counter({'b':3, 'c':4, 'd':5}) >>> A + B Counter({'c': 7, 'b': 5, 'd': 5, 'a': 1})
Счетчики в основном являются подклассом dict, поэтому вы все равно можете делать с ними все остальное, что обычно делаете с этим типом, например, перебирать их ключи и значения.
Ответ 2
Более общее решение, которое работает и для нечисловых значений:
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 inset(b) & set(a)])
или даже более общий:
defcombine_dicts(a, b, op=operator.add): returndict(a.items() + b.items() + [(k, op(a[k], b[k])) for k inset(b) & set(a)])
Например:
>>> a = {'a': 2, 'b':3, 'c':4} >>> b = {'a': 5, 'c':6, 'x':7}
>>> 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 inset(A).union(B)} >>> print(c)
{'a': 1, 'c': 7, 'b': 5, 'd': 5}
Ответ 4
Вступление: Есть (вероятно) лучшие решения. Но вы должны это знать и помнить, а иногда вам приходится надеяться, что ваша версия Python не слишком старая или в чем бы там ни заключалась проблема.
Тогда есть самые "хакерские" решения. Они замечательные и короткие, но иногда их трудно понять, прочитать и запомнить.
Однако есть альтернатива, которая заключается в попытке изобрести велосипед. - Зачем изобретать велосипед? - Обычно потому, что это действительно хороший способ обучения (а иногда просто потому, что уже существующий инструмент делает не совсем то, что вам хотелось бы и / или так, как вам хотелось бы) и самый простой способ, если вы не знаете или не помните идеальный инструмент для вашей проблемы.
Итак, я предлагаю заново изобрести колесо для Counter класса из collections модуля (по крайней мере, частично):
classMyDict(dict): def__add__(self, oth): r = self.copy()
try: for key, val in oth.items(): if key in r: r[key] += val # You can custom it here else: r[key] = val except AttributeError: # In case oth isn't a dict returnNotImplemented# The convention when a case isn't handled
return r
a = MyDict({'a':1, 'b':2, 'c':3}) b = MyDict({'b':3, 'c':4, 'd':5})