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.