Wie summiere ich alle Werte in einem Wörterbuch?


239

Angenommen, ich habe ein Wörterbuch, in dem die Schlüssel Ganzzahlen wie folgt zugeordnet sind:

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

Gibt es eine syntaktisch minimalistische Möglichkeit, die Summe der Werte in - ddh 62in diesem Fall - zurückzugeben?


2
Just for fun: implementieren sumSie sich in Bezug auf reduce- reduceist eine allgemeinere Form (zB sum, minund maxalle in Bezug auf die geschrieben werden kann reduce) und kann andere Probleme (zB lösen product) leicht.

1
Was ist mit Guidos Aussage - ich glaube, ich erinnere mich richtig daran -, dass die Reduzierung verschwindet? Ich bin bei dir. Warum aus der Sprache entfernen?
Octopusgrabbus

Antworten:


471

Wie zu erwarten:

sum(d.values())

1
Nun, Python 2.7.12funktioniert auch gut mitsum(d.values())
LancelotHolmes

7
@LancelotHolmes Ja, aber das erstellt eine Liste im Speicher und kann daher langsamer / näher an den Ressourcengrenzen für große Wörterbücher liegen. Daher lautet diese Antwort "Sie möchten möglicherweise verwenden" anstelle von "Sie müssen verwenden", wenn Sie über Python 2
sprechen

Nett! Ich habe es gesucht, nur weil ich wusste, dass es so etwas geben würde. Nicht, dass es zu viel Arbeit kostet, eine tote dumme for-Schleife zu schreiben;)
runlevel0

Ich weiß nicht, ob Sie Python lieben, ob Sie Python 3 lieben oder ob Sie sich wirklich auf Python 2 beziehen
Lucas Vazquez

1
@LucasVazquez Dies bezog sich auf Python 2 (oder 1). Ich habe es entfernt, da es heutzutage irrelevant ist - selbst wenn Sie neuen Code in Python2 schreiben, können Sie ihn verwenden d.values().
Phihag

70

In Python 2 können Sie mithilfe der itervalues()Wörterbuchmethode, die einen Iterator der Schlüssel des Wörterbuchs zurückgibt, vermeiden, eine temporäre Kopie aller Werte zu erstellen:

sum(d.itervalues())

In Python 3 können Sie nur verwenden, d.values()weil diese Methode geändert wurde (und itervalues()entfernt wurde, da sie nicht mehr benötigt wurde).

Um das Schreiben von versionunabhängigem Code zu vereinfachen, der immer über die Werte der Wörterbuchschlüssel iteriert, kann eine Dienstprogrammfunktion hilfreich sein:

import sys

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

sum(itervalues(d))

Dies ist im Wesentlichen das sixModul von Benjamin Peterson .


5
yup, obwohl dies nicht für Python 3 gilt.
tokland

15

Sicher gibt es. Hier ist eine Möglichkeit, die Werte eines Wörterbuchs zu summieren.

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

Sie können dies mit der for-Schleife tun


3

Ich denke, es sum(d.values())ist der effizienteste Weg, um die Summe zu erhalten.

Sie können auch die Reduktionsfunktion ausprobieren, um die Summe zusammen mit einem Lambda-Ausdruck zu berechnen:

reduce(lambda x,y:x+y,d.values())


0

Die Antwort von phihag (und ähnliche) funktioniert in python3 nicht.

Für Python 3:

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

Aktualisieren! Es gibt Beschwerden, dass es nicht funktioniert! Ich hänge einfach einen Screenshot von meinem Terminal an. Könnte in Versionen usw. nicht übereinstimmen.

Geben Sie hier die Bildbeschreibung ein


Das gleiche Problem gibt es auch, wenn wir es auf diese Weise versuchen
jeevan kishore

es funktioniert einfach gut für mich! Ich habe meine Antwort mit einem Screenshot aktualisiert (kann hier nicht gemacht werden); es könnte etwas mit Versionen zu tun haben ...
Reza

0

Sie könnten 'for loop' in Betracht ziehen:

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

gesamt = 800


1
Oder einfach sum(d.values()), da .values()gibt a zurück List.
Linny

Ja, das ist auch ein anderer Weg.
Rahul Patel

-1

Sie können einen Generator aller Werte im Wörterbuch abrufen, ihn dann in eine Liste umwandeln und die Funktion sum () verwenden, um die Summe aller Werte abzurufen.

Beispiel:

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

sum(list(c.values()))

1
Wie ist das eine Antwort, wenn es nicht funktioniert. Sehen Sie eher wie ein Kommentar zu anderen Antworten aus.
Martin Thøgersen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.