2011-05-31 28 views
6

Tengo una lista que quiero usar como las claves de un diccionario y una lista de tuplas con los valores. Considere lo siguiente:Diccionario de Python con lista como claves y tupla como valores

d = {} 
l = ['a', 'b', 'c', 'd', 'e'] 
t = [(1, 2, 3, 4), (7, 8, 9, 10), (4, 5, 6, 7), (9, 6, 3, 8), (7, 4, 1, 2)] 

for i in range(len(l)): 
    d[l[i]] = t[i] 

La lista será constantemente 5 valores y habrá siempre será por 5 tuplas sin embargo, hay cientos de miles de valores en cada tupla.

Mi pregunta es esta: ¿cuál es la manera MÁS RÁPIDA de poblar el diccionario, d, con las tuplas en t, con las claves siendo los valores en l?

Respuesta

17

lo hice no hay horarios, pero probablemente

d = dict(zip(l, t)) 

habrá bastante bueno. Por solo 5 pares clave-valor, no creo que izip() brinde ninguna ventaja sobre zip(). El hecho de que cada tupla tenga muchos elementos no importa para esta operación, ya que los objetos de la tupla no se copian en ningún punto, ni con su enfoque ni con el mío. Solo los punteros a los objetos de la tupla se insertan en el dicitonario.

9

Para construir en Sven answer, usar itertools.izip sería más rápido y usaría menos memoria si necesitara crear un dict más grande. Con solo cinco pares clave/valor, el tiempo para construir el dict será minúsculo.

python -m timeit -s "l = l2 = range(100000)" "dict(zip(l, l2))" 
1000 loops, best of 3: 20.1 msec per loop 
python -m timeit -s "import itertools; l = l2 = range(100000)" "dict(itertools.izip(l, l2))" 
1000 loops, best of 3: 9.59 msec per loop 
+1

Estos tiempos utilizan mucho más de 5 pares clave-valor, por lo que no me sorprende la diferencia. Solo por 5 pares clave-valor, la diferencia será inmaterial. (Por cierto, +1 para medir realmente en lugar de adivinar!) –

+0

@Sven Ese es un buen punto. Con solo 5 pares clave-valor, la velocidad será minúscula de cualquier manera. – zeekay

Cuestiones relacionadas