2011-02-02 21 views
129

Diciamo che ho un dizionario in cui le chiavi mappa per interi come:Come sommare tutti i valori in un dizionario?

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

Esiste un modo sintatticamente minimalista per restituire la somma dei valori in d -i.e. 62 in questo caso?

+2

Solo per divertimento: implementa 'sum' te stesso in termini di [' reduce'] (http://docs.python.org/library/functions.html) - 'reduce' è una forma più generale (ad esempio' sum', 'min' e' max' possono essere tutti scritti in termini di 'reduce') e possono risolvere facilmente altri problemi (ad esempio' prodotto'). –

+1

Che dire del fatto che Guido - penso di ricordarlo correttamente - che la riduzione stia andando via? Sono con te. Perché rimuoverlo dalla lingua? – octopusgrabbus

risposta

253

Come ci si aspetterebbe:

sum(d.values()) 

In Python < 3, si consiglia di utilizzare itervalues invece (che non a costruire una lista temporanea).

+0

Bene, 'Python 2.7.12' funziona bene anche con' sum (d.values ​​()) ' – LancelotHolmes

+5

@LancelotHolmes Sì, ma crea un elenco in memoria e può quindi essere più lento/vicino ai limiti delle risorse per i dizionari di grandi dimensioni. Quindi, questa risposta dice "tu * potresti * vuoi usare" invece di "tu * devi * usare" quando discuti di Python 2. – phihag

11

Certo che c'è. Ecco un modo per sommare i valori di un dizionario.

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

In Python 2 si può evitare di fare una copia temporanea di tutti i valori utilizzando il metodo itervalues() dizionario, che restituisce un iteratore di chiavi del dizionario:

sum(d.itervalues()) 

In Python 3 si può solo utilizzare d.values() perché questo metodo è stato modificato per farlo (e itervalues() è stato rimosso poiché non era più necessario).

Per rendere più facile scrivere versione del codice indipendente che sempre itera oltre i valori delle chiavi del dizionario, una funzione di utilità può essere utile:

import sys 

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

sum(itervalues(d)) 

Questo è essenzialmente ciò che il modulo di Benjamin Peterson six fa.

+4

sì, anche se questo non si applica a python 3. – tokland

Problemi correlati