Jak zsumować wszystkie wartości w słowniku?

239

Załóżmy, że mam słownik, w którym klucze są odwzorowane na liczby całkowite, takie jak:

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

Czy istnieje syntaktycznie minimalistyczny sposób na zwrócenie sumy wartości w d—ie 62w tym przypadku?

nedblorf
źródło
2
Tak dla zabawy: wdrożyć sumsię w kategoriach reduce- reducejest bardziej powszechną formą (np sum, mini maxmogą być w całości napisany w kategoriach reduce) i może rozwiązać inne problemy (np product) łatwo.
1
Co powiesz na Guido - myślę, że dobrze to pamiętam - że redukcja odchodzi? Jestem z tobą. Po co usuwać go z języka?
octopusgrabbus

Odpowiedzi:

471

Jak można się spodziewać:

sum(d.values())
phihag
źródło
1
Dobrze Python 2.7.12działa również zsum(d.values())
LancelotHolmes
7
@LancelotHolmes Tak, ale to tworzy listę w pamięci, a zatem może być wolniejsze / bliższe limitom zasobów dla dużych słowników. Zatem ta odpowiedź mówi „ty może chcesz używać” zamiast „ty musi użyć” omawiając Python 2.
phihag
Miły! Szukałem tego tylko dlatego, że wiedziałem, że będzie coś takiego. Nie znaczy to jednak, że napisanie martwej głupoty dla pętli wymaga zbyt wiele pracy;)
runlevel0
Nie wiem, czy kochasz Python, czy kochasz Python 3, czy też tak naprawdę chodzi o Python 2
Lucas Vazquez
1
@LucasVazquez Odnosi się to do Pythona 2 (lub 1). Usunąłem go, ponieważ obecnie nie ma on znaczenia - nawet jeśli napiszesz nowy kod w Python2, możesz go użyć d.values().
phihag
70

W Pythonie 2 można uniknąć tworzenia tymczasowej kopii wszystkich wartości za pomocą itervalues()metody Dictionary, która zwraca iterator kluczy słownika:

sum(d.itervalues())

W Pythonie 3 możesz po prostu użyć, d.values()ponieważ ta metoda została w tym celu zmieniona (i itervalues()została usunięta, ponieważ nie była już potrzebna).

Aby ułatwić pisanie kodu niezależnego od wersji, który zawsze przechodzi przez wartości kluczy słownika, przydatna może być funkcja narzędziowa:

import sys

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

sum(itervalues(d))

To właśnie sixrobi moduł Benjamina Petersona .

martineau
źródło
5
tak, choć nie dotyczy to Pythona 3.
tokland
15

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

>>> d = {'key1':1,'key2':14,'key3':47}
>>> sum(d.values())
62
vz0
źródło
4
d = {'key1': 1,'key2': 14,'key3': 47}
sum1 = sum(d[item] for item in d)
print(sum1)

możesz to zrobić za pomocą pętli for

Kalyan Pendyala
źródło
3

Uważam, że sum(d.values())jest to najbardziej skuteczny sposób na uzyskanie sumy.

Możesz także wypróbować funkcję zmniejszania, aby obliczyć sumę wraz z wyrażeniem lambda:

reduce(lambda x,y:x+y,d.values())
Pratyush Raizada
źródło
1

sum (d.values ​​()) - "d" -> Twój słownik Zmienna

Behlul Valiyev
źródło
0

Odpowiedź phihag (i podobne) nie będzie działać w python3.

Dla python 3:

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

Aktualizacja! Narzekają, że to nie działa! Właśnie dołączam zrzut ekranu z mojego terminala. Może występować niedopasowanie w wersjach itp.

wprowadź opis zdjęcia tutaj

Reza
źródło
Ten sam problem istnieje, nawet jeśli spróbujemy w ten sposób
jeevan kishore,
to po prostu działa dla mnie dobrze! Zaktualizowałem swoją odpowiedź za pomocą zrzutu ekranu (tutaj nie można tego zrobić); to może mieć coś wspólnego z wersjami ...
Reza
0

Możesz rozważyć „pętlę for”:

  d = {'data': 100, 'data2': 200, 'data3': 500}
  total = 0
  for i in d.values():
        total += i

ogółem = 800

Rahul Patel
źródło
1
Lub po prostu sum(d.values()), ponieważ .values()zwraca a List.
Linny,
tak, to też jest inna droga.
Rahul Patel
-1

Możesz pobrać generator wszystkich wartości ze słownika, a następnie rzucić go na listę i użyć funkcji sum (), aby uzyskać sumę wszystkich wartości.

Przykład:

c={"a":123,"b":4,"d":4,"c":-1001,"x":2002,"y":1001}

sum(list(c.values()))
użytkownik12988654
źródło
1
Jak to jest odpowiedź, jeśli nie działa. Wyglądają bardziej jak komentarz do innych odpowiedzi.
Martin Thøgersen