Somma i valori, quindi utilizzare la comprensione dizionario per la produzione di un nuovo dizionario con i valori normalizzati:
total = sum(a.itervalues(), 0.0)
a = {k: v/total for k, v in a.iteritems()}
si può spremere che in un one-liner, ma non sarà più leggibili:
a = {k: v/total for total in (sum(a.itervalues(), 0.0),) for k, v in a.iteritems()}
ho dato sum()
con un po galleggiante int valore iniziale per evitare che l'operatore /
utilizzi la divisione floor in Python 2, cosa che succederebbe se total
e v
fossero entrambi numeri interi.
In Python 3, cadere le iter*
prefissi:
a = {k: v/total for total in (sum(a.values()),) for k, v in a.items()}
Nota che fate non desidera utilizzare {k: v/sum(a.values()) for k, v in a.items()}
qui; l'espressione del valore viene eseguita per ogni iterazione nel ciclo di comprensione, ricalcolando il numero sum()
ancora e ancora. Il numero sum()
esegue il ciclo su tutti gli elementi N nel dizionario, quindi si finisce con una soluzione quadratica O (N^2) anziché con una soluzione O (N) al problema.
fonte
2015-06-21 12:41:25
Perché "una linea"? – Daniel