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?

nedblorf
quelle
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())
Phihag
quelle
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 .

Martineau
quelle
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
vz0
quelle
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

Kalyan Pendyala
quelle
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())
Pratyush Raizada
quelle
1

sum (d.values ​​()) - "d" -> Ihre Wörterbuchvariable

Behlul Valiyev
quelle
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

Reza
quelle
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

Rahul Patel
quelle
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()))
user12988654
quelle
1
Wie ist das eine Antwort, wenn es nicht funktioniert. Sehen Sie eher wie ein Kommentar zu anderen Antworten aus.
Martin Thøgersen