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?


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())

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 .


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

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


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())


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


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


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()))

1
Jak to jest odpowiedź, jeśli nie działa. Wyglądają bardziej jak komentarz do innych odpowiedzi.
Martin Thøgersen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.