Сумма значений одинаковых ключей внутри двух вложенных словарей в python

у меня есть вложенный словарь, как это:

data = {
    "2010":{
            'A':2,
            'B':3,
            'C':5,
            'D':-18,
        },
    "2011":{
            'A':1,
            'B':2,
            'C':3,
            'D':1,
        },
    "2012":{
            'A':1,
            'B':2,
            'C':4,
            'D':2
        }
    }

в моем случае мне нужно суммировать все значения на основе аналогичных ключей каждый год, с 2010 по 2012 год.. Поэтому результат, который я ожидал, должен быть таким:

data = {'A':4,'B':7, 'C':12, 'D':-15}

2 ответов


попробуйте это,

reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.iteritems()), data.values())

результат

{'A': 4, 'B': 7, 'C': 12, 'D': -15}

можно использовать collections.Counter() (работает только для положительных значений!):

In [17]: from collections import Counter
In [18]: sum((Counter(d) for d in data.values()), Counter())
Out[18]: Counter({'C': 12, 'B': 7, 'A': 4, 'D': 3})

обратите внимание, что на основе документации python Counter предназначен только для случаев применения с положительными значениями:

методы multiset предназначены только для случаев использования с положительными значениями. Входы могут быть отрицательными или нулевыми, но создаются только выходы с положительными значениями. Ограничений типа нет, но тип значения должен поддерживать сложение, вычитание и сравнение. Этот elements() метод требует целых чисел. Он игнорирует ноль и отрицательные отсчеты.

так что если вы хотите получить полный результат вы можете сделать суммирование вручную. The collections.defaultdict() это хороший способ обойти эту проблему:

In [28]: from collections import defaultdict

In [29]: d = defaultdict(int)

In [30]: for sub in data.values():
   ....:     for i, j in sub.items():
   ....:         d[i] += j
   ....:         

In [31]: d
Out[31]: defaultdict(<class 'int'>, {'D': -15, 'A': 4, 'C': 12, 'B': 7})