2009-04-15 9 views
6

Qual è il modo "più poderoso" per costruire un dizionario in cui ho i valori in una sequenza e ogni chiave sarà una funzione del suo valore? Attualmente sto usando il seguente, ma mi sento come se mi mancasse un modo più pulito. NOTA: values è un elenco non correlato a nessun dizionario.C'è un modo più pitonioso per costruire questo dizionario?

for value in values: 
    new_dict[key_from_value(value)] = value 

risposta

15
>>> l = [ 1, 2, 3, 4 ] 
>>> dict((v, v**2) for v in l) 
{1: 1, 2: 4, 3: 9, 4: 16} 

In Python 3.0 è possibile utilizzare un "dict di comprensione", che è fondamentalmente una scorciatoia per quanto sopra:

{ v : v**2 for v in l } 
+0

È intorno al 2.6 tramite qualche importatore? –

+0

Sarebbe stato, ma l'IIRC non è riuscito a farcela in tempo. – Kiv

+0

L'ultima volta che ho sentito, le comprensioni dettate arrivavano in 2.7; Non posso aspettare! –

18

almeno è più breve:

dict((key_from_value(value), value) for value in values) 
+0

... e divinatorio! –

0

Questo metodo evita la sintassi di comprensione dell'elenco:

dict(zip(map(key_from_value, values), values)) 

Non rivendicherò mai di essere un'autorità in "Pythonic", ma in questo modo sembra un buon modo.

+0

In questo caso, dove c'è una funzione già definita per ottenere la chiave, direi che entrambi gli approcci sono buoni. Se la zip/mappa richiedesse anche un lambda, farebbe pendere l'equilibrio in favore di una comprensione. In generale, se una mappa o un filtro richiede un lambda, è meglio comprenderlo. – babbageclunk

5

Py3K:

{ key_for_value(value) : value for value in values } 
Problemi correlati