Comment additionner toutes les valeurs dans un dictionnaire?

239

Disons que j'ai un dictionnaire dans lequel les clés correspondent à des entiers comme:

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

Existe-t-il une manière syntaxiquement minimaliste de renvoyer la somme des valeurs dans d—ie 62dans ce cas?

nedblorf
la source
2
Juste pour le plaisir: sumvous implémenter en termes de reduce- reduceest une forme plus générale (par exemple sum, minet maxpeut être écrite en termes de reduce) et peut résoudre d'autres problèmes (par exemple product) facilement.
1
Qu'en est-il du dicton de Guido - je pense que je m'en souviens bien - que la réduction va disparaître? Je suis d'accord. Pourquoi le supprimer de la langue?
octopusgrabbus

Réponses:

472

Comme vous vous en doutez:

sum(d.values())
phihag
la source
1
Eh bien, Python 2.7.12fonctionne aussi bien avecsum(d.values())
LancelotHolmes
7
@LancelotHolmes Oui, mais cela crée une liste en mémoire, et peut donc être plus lent / plus proche des limites de ressources pour les grands dictionnaires. Ainsi, cette réponse dit "vous voudrez peut -être utiliser" au lieu de "vous devez utiliser" lorsque vous discutez de Python 2.
phihag
Agréable! Je l'ai cherché juste parce que je savais qu'il y aurait quelque chose comme ça. Ce n'est pas qu'il faut trop de travail pour écrire une boucle idiote pour la boucle;)
runlevel0
Je ne sais pas si vous aimez le python, si vous aimez le python 3, ou si vous faites vraiment référence à un python 2
Lucas Vazquez
1
@LucasVazquez Ceci faisait référence à Python 2 (ou 1). Je l'ai supprimé car il n'est plus pertinent de nos jours - même si vous écrivez du nouveau code en Python2, vous pouvez l'utiliser d.values().
phihag
70

Dans Python 2, vous pouvez éviter de faire une copie temporaire de toutes les valeurs en utilisant la itervalues()méthode du dictionnaire, qui renvoie un itérateur des clés du dictionnaire:

sum(d.itervalues())

Dans Python 3, vous pouvez simplement l'utiliser d.values()parce que cette méthode a été modifiée pour cela (et a itervalues()été supprimée car elle n'était plus nécessaire).

Pour faciliter l'écriture de code indépendant de la version qui itère toujours sur les valeurs des clés du dictionnaire, une fonction utilitaire peut être utile:

import sys

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

sum(itervalues(d))

C'est essentiellement ce que fait le sixmodule de Benjamin Peterson .

martineau
la source
5
yup, bien que cela ne s'applique pas à python 3.
tokland
15

Bien sûr que oui. Voici un moyen de résumer les valeurs d'un dictionnaire.

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

vous pouvez le faire en utilisant la boucle for

Kalyan Pendyala
la source
3

Je ressens sum(d.values()) c'est le moyen le plus efficace pour obtenir la somme.

Vous pouvez également essayer la fonction de réduction pour calculer la somme avec une expression lambda:

reduce(lambda x,y:x+y,d.values())
Pratyush Raizada
la source
1

sum (d.values ​​()) - "d" -> Votre dictionnaire Variable

Behlul Valiyev
la source
0

la réponse de phihag (et les réponses similaires) ne fonctionnera pas en python3.

Pour python 3:

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

Mettre à jour! On se plaint que cela ne fonctionne pas! Je joins simplement une capture d'écran de mon terminal. Il pourrait y avoir un décalage dans les versions, etc.

entrez la description de l'image ici

Reza
la source
Le même problème existe même si nous essayons de cette façon
jeevan kishore
ça marche bien pour moi! J'ai mis à jour ma réponse avec une capture d'écran (je ne peux pas le faire ici); cela pourrait avoir quelque chose à voir avec les versions ...
Reza
0

Vous pouvez envisager `` pour la boucle '' pour cela:

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

total = 800

Rahul Patel
la source
1
Ou tout simplement sum(d.values()), puisque .values()renvoie a List.
Linny
ouais c'est aussi une autre façon.
Rahul Patel
-1

Vous pouvez obtenir un générateur de toutes les valeurs du dictionnaire, puis le convertir en liste et utiliser la fonction sum () pour obtenir la somme de toutes les valeurs.

Exemple:

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

sum(list(c.values()))
user12988654
la source
1
Comment est-ce une réponse, si cela ne fonctionne pas. Ressemble plus à un commentaire à d'autres réponses.
Martin Thøgersen