2015-06-21 12 views

risposta

14

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.

+1

Penso che non sia necessario 'total' qui' {k: v/sum (a.values ​​(), 0.0) per k, v in a.items()} ' – styvane

+2

@ user3100115: nel qual caso la somma() 'verrebbe eseguito per * ogni coppia chiave-valore *, eseguendo un ciclo completo su tutti i valori ogni volta. Dovresti produrre un ciclo N * N piuttosto che un ciclo N. Sceglierei lineare su quadratico in qualsiasi momento. –

+0

Grazie mille Martijn! –

0

l'ho fatto usando una funzione

a = {'foo': 2, 'bar': 3, 'baz': 5} 
def func1(my_diction): 
    total = 0 
    for i in my_diction: 
     total = total + my_diction[i] 
    for j in my_diction: 
     my_diction[j] = (float)(my_diction[j])/total 
    return my_diction  

print (func1(a)) 
0
def div_d(my_dict): 

    sum_p = sum(my_dict.values()) 

    for i in my_dict: 
     my_dict[i] = float(my_dict[i]/sum_p) 

    return my_dict 

P.S io sono totalmente nuovo per la programmazione ma questo è il meglio che ho potuto pensare fuori.

Problemi correlati