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?


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

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 .


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

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


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


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


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


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

1
Comment est-ce une réponse, si cela ne fonctionne pas. Ressemble plus à un commentaire à d'autres réponses.
Martin Thøgersen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.