¿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?


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

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 .


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

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

puedes hacerlo usando el bucle for


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


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í


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


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

1
¿Cómo es esta una respuesta, si no funciona? Parece más como un comentario a otras respuestas.
Martin Thøgersen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.