¿Cómo sumar todos los valores en un diccionario?

239

Digamos que tengo un diccionario en el que las teclas se asignan a enteros como:

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

¿Existe una forma sintácticamente minimalista de devolver la suma de los valores en d—ie 62en este caso?

nedblorf
fuente
2
Solo por diversión: sumimpleméntese en términos de reduce- reducees una forma más general (por ejemplo sum, miny maxpuede escribirse en términos de reduce) y puede resolver otros problemas (por ejemplo product) fácilmente.
1
¿Qué pasa con el dicho de Guido, creo que recuerdo esto correctamente, que la reducción va a desaparecer? Estoy contigo. ¿Por qué eliminarlo del idioma?
octopusgrabbus

Respuestas:

471

Como es de esperar:

sum(d.values())
phihag
fuente
1
Bueno, Python 2.7.12también funciona bien consum(d.values())
LancelotHolmes
77
@LancelotHolmes Sí, pero eso crea una lista en la memoria y, por lo tanto, puede ser más lento / más cercano a los límites de recursos para diccionarios grandes. Por lo tanto, esta respuesta dice "es posible que desee usar" en lugar de " debe usar" cuando se discute Python 2.
phihag
¡Agradable! Lo busqué solo porque sabía que habría algo así. No es que se requiera demasiado trabajo para escribir un bucle tonto muerto;)
runlevel0
No sé si amas Python, si amas Python 3, o si realmente te estás refiriendo a una Python 2
Lucas Vazquez
1
@LucasVazquez Esto se refería a Python 2 (o 1). Lo eliminé porque es irrelevante hoy en día, incluso si escribes código nuevo en Python2, puedes usarlo d.values().
phihag
70

En Python 2, puede evitar hacer una copia temporal de todos los valores utilizando el itervalues()método del diccionario, que devuelve un iterador de las claves del diccionario:

sum(d.itervalues())

En Python 3 puedes usarlo d.values()porque ese método se cambió para hacerlo (y itervalues()se eliminó porque ya no era necesario).

Para facilitar la escritura del código independiente de la versión que siempre itera sobre los valores de las teclas del diccionario, una función de utilidad puede ser útil:

import sys

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

sum(itervalues(d))

Esto es esencialmente lo que hace el sixmódulo de Benjamin Peterson .

Martineau
fuente
55
sí, aunque esto no se aplica a python 3.
tokland
15

Claro que lo hay. Aquí hay una manera de sumar los valores de un diccionario.

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

puedes hacerlo usando el bucle for

Kalyan Pendyala
fuente
3

Creo que sum(d.values())es la forma más eficiente de obtener la suma.

También puede probar la función reducir para calcular la suma junto con una expresión lambda:

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

sum (d.values ​​()) - "d" -> Su variable de diccionario

Behlul Valiyev
fuente
0

La respuesta de phihag (y otras similares) no funcionará en python3.

Para python 3:

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

¡Actualizar! Hay quejas de que no funciona! Acabo de adjuntar una captura de pantalla desde mi terminal. Podría haber algún desajuste en las versiones, etc.

ingrese la descripción de la imagen aquí

Reza
fuente
El mismo problema existe incluso si lo intentamos de esta manera
jeevan kishore
¡simplemente funciona bien para mí! Actualicé mi respuesta con una captura de pantalla (no puedo hacerlo aquí); podría tener algo que ver con las versiones ...
Reza
0

Podría considerar 'for loop' para esto:

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

total = 800

Rahul Patel
fuente
1
O simplemente sum(d.values()), ya que .values()devuelve a List.
Linny
Sí, esa es otra manera también.
Rahul Patel
-1

Puede obtener un generador de todos los valores en el diccionario, luego convertirlo en una lista y usar la función sum () para obtener la suma de todos los valores.

Ejemplo:

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

sum(list(c.values()))
usuario12988654
fuente
1
¿Cómo es esta una respuesta, si no funciona? Parece más como un comentario a otras respuestas.
Martin Thøgersen