2013-03-11 3 views
3

У меня есть словарь счетчиков, например:Сумма значений во всех вложенных словарей в Python

from collections import Counter, defaultdict 

numbers = defaultdict(Counter) 

numbers['a']['first'] = 1 
numbers['a']['second'] = 2 
numbers['b']['first'] = 3 

Я хочу, чтобы получить сумму: 1 + 2 + 3 = 6

Что бы простейший/идиоматический способ сделать это в python 3?

ответ

7

Использование вложенной постижение:

sum(x for counter in numbers.values() for x in counter.values()) 

Или сумма первых счетчиков (начиная с пустой), а затем их значения:

sum(sum(numbers.values(), Counter()).values()) 

Или первые значения каждого счетчика, а затем промежуточные результаты:

sum(sum(c.values()) for c in numbers.values()) 

Цепочка использования:

from itertools import chain 
sum(chain.from_iterable(d.values() for d in numbers.values())) 

Я предпочитаю первый способ.

1
from itertools import chain 
sum(chain.from_iterable(d.values() for d in numbers.values())) 
# outputs: 6 

С точки зрения использования производительности .itervalues() в Python 2.x, что позволяет избежать строительства посредническую список (относится ко всем решениям здесь).

sum(chain.from_iterable(d.itervalues() for d in numbers.itervalues())) 
Смежные вопросы