2009-04-15 12 views
6

¿Cuál es la forma "más pitónica" de construir un diccionario donde tengo los valores en una secuencia y cada tecla será una función de su valor? Actualmente estoy usando lo siguiente, pero siento que me falta una manera más limpia. NOTA: values es una lista que no está relacionada con ningún diccionario.¿Hay alguna manera más pitónica de construir este diccionario?

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

Respuesta

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

En Python 3.0 se puede utilizar una "comprensión dict", que es básicamente una forma abreviada de lo anterior:

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

¿Está esto en 2.6 mediante algún truco de importación? –

+0

Iba a ser, pero IIRC nadie lo consiguió a tiempo. – Kiv

+0

Lo último que escuché, las comprensiones dictadas venían en 2.7; No puedo esperar! –

18

por lo menos es más corto:

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

... y Pythonic! –

0

Este método evita la sintaxis de comprensión de la lista:

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

Nunca diré que soy una autoridad en "Pythonic", pero de esta manera me siento como una buena manera.

+0

En este caso, donde hay una función ya definida para obtener la clave, diría que cualquiera de los enfoques es bueno. Si el zip/map requería una lambda también, inclinaría la balanza a favor de una comprensión. En general, si un mapa o filtro requiere una lambda, es mejor con una comprensión. – babbageclunk

5

Py3K:

{ key_for_value(value) : value for value in values } 
Cuestiones relacionadas