2012-10-25 12 views
30

Desidero applicare una funzione a tutti i valori in dict e archiviarla in un dettato separato. Sto solo cercando di vedere come posso giocare con python e vogliono vedere come posso riscrivere qualcosa di simileApplicazione di una funzione ai valori in dict

for i in d: 
    d2[i] = f(d[i]) 

a qualcosa di simile

d2[i] = f(d[i]) for i in d 

Il primo modo di scrivere è naturalmente bene , ma sto cercando di capire come la sintassi Python può essere modificato

risposta

45

Se stai usando Python 2.7 o 3.x:

d2 = {k: f(v) for k, v in d1.items()} 

che è equivalente a:

d2 = {} 
for k, v in d1.items(): 
    d2[k] = f(v) 

Altrimenti:

d2 = dict((k, f(v)) for k, v in d1.items()) 
+11

+1. Nota che questo sta creando un nuovo dizionario 'd2' invece di modificarne uno sul posto. Ma questo è quasi sempre ciò che vuoi veramente fare. Se hai davvero bisogno di aggiornare 'd2' sul posto, puoi sempre fare' d2.update ({k: f (v) per k, v in d1.items()}) '. – abarnert

+0

utilizzando 3.xe il secondo approccio funziona bene. esattamente quello che stavo cercando. grazie – chrise

+0

grazie per il tuo commento abarnert. Ho bisogno di creare un nuovo dict in questo caso, ma buono a sapersi per altri casi. Grazie – chrise

4
d2 = dict((k, f(v)) for k,v in d.items()) 
3

Dizionari può essere nidificato in Python e in questo caso la soluzione d2 = {k: f(v) for k, v in d1.items()} non funzionerà.

Per i dizionari nidificati è necessaria una funzione per attraversare l'intera struttura dati. Per esempio, se i valori possono essere essi stessi dizionari, si può definire una funzione come:

def myfun(d): 
    for k, v in d.iteritems(): 
    if isinstance(v, dict): 
     d[k] = myfun(v) 
    else: 
     d[k] = f(v) 
    return d 

E poi

d2 = myfun(d) 
Problemi correlati