Сумма значений одинаковых ключей внутри двух вложенных словарей в 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})