2011-02-02 12 views
129

Digamos que tengo un diccionario en el que las teclas se asignan a números enteros como:¿Cómo se suman todos los valores en un diccionario?

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

¿Hay una manera sintácticamente minimalista para devolver la suma de los valores en d -i.e. 62 en este caso?

+2

Simplemente por diversión: implemente 'sum' usted mismo en términos de [' reduce'] (http://docs.python.org/library/functions.html) - 'reduce' es una forma más general (por ejemplo' sum', 'min' y' max' pueden escribirse en términos de 'reducir') y pueden resolver otros problemas (por ejemplo' product') fácilmente. –

+1

¿Qué hay del dicho de Guido, creo que recuerdo esto correctamente, que la reducción se va? Estoy contigo. ¿Por qué eliminarlo del idioma? – octopusgrabbus

Respuesta

253

Como era de esperar:

sum(d.values()) 

En Python < 3, es posible que desee utilizar itervalues lugar (que no construye una lista temporal).

+0

Bueno, 'Python 2.7.12' también funciona bien con' sum (d.values ​​()) ' – LancelotHolmes

+5

@LancelotHolmes Sí, pero eso crea una lista en la memoria y, por lo tanto, puede ser más lenta/más cercana a los límites de recursos para diccionarios grandes. Por lo tanto, esta respuesta dice "usted * puede * querer usar" en lugar de "usted * debe * usar" cuando habla de Python 2. – phihag

11

Sure is is. Aquí hay una manera de sumar los valores de un diccionario.

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

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

sum(d.itervalues()) 

En Python 3 que sólo puede use d.values() porque ese método fue cambiado para hacer eso (y se eliminó itervalues() porque ya no era necesario).

Para que sea más fácil escribir código versión independiente que siempre itera sobre los valores de las claves 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 módulo de Benjamin Peterson six.

+4

yup, aunque esto no se aplica a python 3. – tokland

Cuestiones relacionadas