2010-01-30 12 views
7

Soy un novato de Python y una de las cosas que trato de hacer es relajar mi comprensión de la lista. Puedo ver que es una característica bastante poderosa que vale la pena aprender.Usar la comprensión de listas en Python para hacer algo similar a zip()?

cities = ['Chicago', 'Detroit', 'Atlanta'] 
airports = ['ORD', 'DTW', 'ATL'] 

print zip(cities,airports) 
[('Chicago', 'ORD'), ('Detroit', 'DTW'), ('Atlanta', 'ATL')] 

¿Cómo se utiliza la lista de comprensión para que pueda obtener los resultados como una serie de listas dentro de una lista, en lugar de una serie de tuplas dentro de una lista?

[['Chicago', 'ORD'], ['Detroit', 'DTW'], ['Atlanta', 'ATL']] 

(que se dan cuenta de que los diccionarios, probablemente sería más apropiado en esta situación, pero sólo estoy tratando de entender un poco mejor las listas). ¡Gracias!

Respuesta

26

Algo como esto:

[[c, a] for c, a in zip(cities, airports)] 

Alternativamente, el list constructor puede convertir tuplas a las listas:

[list(x) for x in zip(cities, airports)] 

O, la función map es ligeramente menos detallado en este caso:

map(list, zip(cities, airports)) 
1

Esto toma zip 'S de salida y convierte todas las tuplas a las listas:

map(list, zip(cities, airports)) 

En cuanto a la actuación de cada uno:

$ python -m timeit -c '[ [a, b] for a, b in zip(xrange(100), xrange(100)) ]' 
10000 loops, best of 3: 68.3 usec per loop 

$ python -m timeit -c 'map(list, zip(xrange(100), xrange(100)))' 
10000 loops, best of 3: 75.4 usec per loop 

$ python -m timeit -c '[ list(x) for x in zip(range(100), range(100)) ]' 
10000 loops, best of 3: 99.9 usec per loop 
+0

-1: El PO preguntó específicamente para una lista por comprensión. –

4

Una lista por comprensión, y sin la ayuda de zip, map o itertools, no puede instituir un " bucle paralelo "en múltiples secuencias: solo bucles simples en una secuencia, o bucles" anidados "en múltiples.

+0

Se puede hacer como Dave Kirby ha demostrado – inspectorG4dget

5

Si quisiera hacerlo sin utilizar postal en absoluto, usted tendría que hacer algo como esto:

[ [cities[i],airports[i]] for i in xrange(min(len(cities), len(airports))) ] 

pero no hay razón para hacerlo que no sea un ejercicio intelectual.

El uso de map(list, zip(cities, airports)) es más corto, más simple y casi seguro se ejecutará más rápido.

+0

Por otro lado, usar una lista de comprensión y un zip juntos es tan breve, y para mí al menos, incluso más simple. ¿Sabes cómo se compara el rendimiento con el mapa? –

0

posible utilizar enumerate, así:

[[y,airports[x]] for x,y in enumerate(cities)] 
Cuestiones relacionadas