2011-02-02 42 views
129

Powiedzmy mam słownika, w którym klawisze mapowania do liczb całkowitych, takich jak:Jak podsumować wszystkie wartości w słowniku?

d = {'key1': 1,'key2': 14,'key3': 47} 

Czy jest składniowo minimalistyczny sposób, aby powrócić sumę wartości w d -i.e. 62 w tym przypadku?

+2

Dla przyjemności: zaimplementuj 'sum' siebie w kategoriach [' reduce'] (http://docs.python.org/library/functions.html) - 'reduce' jest bardziej ogólną formą (np.' ' sum', 'min' i' max' mogą być napisane w kategoriach 'reduce') i mogą łatwo rozwiązać inne problemy (np.' product'). –

+1

A co z powiedzeniem Guido - myślę, że pamiętam to poprawnie - że redukcja odchodzi? Jestem z tobą. Dlaczego warto usunąć to z języka? – octopusgrabbus

Odpowiedz

253

Jak można się spodziewać:

sum(d.values()) 

W Pythonie < 3, może chcesz używać itervalues zamiast (który nie buduje listę tymczasowy).

+0

Cóż, 'Python 2.7.12' działa również z' sum (d.values ​​()) ' – LancelotHolmes

+5

@LancelotHolmes Tak, ale to buduje listę w pamięci, a tym samym może być wolniejsze/bliższe limitom zasobów dla dużych słowników. Tak więc, ta odpowiedź mówi "ty * możesz * chcieć użyć" zamiast "ty * musisz * używać" podczas omawiania Pythona 2. – phihag

11

Pewnie, że jest. Oto sposób na zsumowanie wartości słownika.

>>> d = {'key1':1,'key2':14,'key3':47} 
>>> sum(d.values()) 
62 
58

W Pythonie 2 można uniknąć tymczasową kopię wszystkich wartości za pomocą metody itervalues() słownika, która zwraca iterator kluczy słownika to:

sum(d.itervalues()) 

W Pythonie 3 można po prostu użyj d.values(), ponieważ ta metoda została zmieniona, aby to zrobić (i usunięto itervalues(), ponieważ nie była już potrzebna).

Aby łatwiej napisać wersji niezależnej kod, który zawsze wykonuje iteracje nad wartościami kluczy słownika użytkownika, funkcja narzędzie może być pomocne:

import sys 

def itervalues(d): 
    return iter(getattr(d, ('itervalues', 'values')[sys.version_info[0]>2])()) 

sum(itervalues(d)) 

Jest to w zasadzie to, co robi moduł Benjamin Petersona six.

+4

tak, choć nie dotyczy to pythona 3. – tokland

Powiązane problemy