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.
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'). –
Che dire del fatto che Guido - penso di ricordarlo correttamente - che la riduzione stia andando via? Sono con te. Perché rimuoverlo dalla lingua? – octopusgrabbus