2010-01-30 5 views
7

Ich bin ein Python-Neuling und eines der Dinge, die ich versuche zu tun, ist meinen Kopf um Listenverständnis zu wickeln. Ich kann sehen, dass es ein ziemlich starkes Feature ist, das es wert ist, gelernt zu werden.Verwenden Sie Listenverständnis in Python, um etwas Ähnliches wie zip() zu tun?

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

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

Wie verwende ich Liste Verständnis, damit ich die Ergebnisse als eine Reihe von Listen in einer Liste bekommen, statt einer Reihe von Tupeln in einer Liste?

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

(Ich weiß, dass Wörterbücher wahrscheinlich in dieser Situation besser geeignet sein würde, aber ich versuche nur Listen ein bisschen besser zu verstehen). Vielen Dank!

Antwort

26

Etwas wie folgt aus:

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

Alternativ kann der list Konstruktor kann Tupel Listen konvertieren:

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

Oder die map Funktion ist etwas weniger ausführlich in diesem Fall:

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

Dies dauert zip ‚S-Ausgang und konvertiert alle Tupel Listen:

map(list, zip(cities, airports)) 

Was die Leistung der einzelnen:

$ 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: Die OP speziell für eine Liste Verständnis gefragt. –

4

Eine Liste Verständnis, ohne Hilfe von zip, map oder itertools kann ein nicht einführen" Parallele Schleife "bei mehreren Sequenzen - nur einfache Schleifen in einer Sequenz oder" verschachtelte "Schleifen in mehreren Sequenzen.

+0

Es kann getan werden, wie Dave Kirby demonstriert – inspectorG4dget

5

Wenn Sie es ohne Reißverschluss tun wollten, würden Sie so etwas zu tun haben:

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

aber es gibt keinen Grund, dass andere als eine intellektuelle Übung zu tun.

Verwenden Sie map(list, zip(cities, airports)) ist kürzer, einfacher und wird fast sicher schneller laufen.

+0

Auf der anderen Seite ist die Verwendung eines Listenverständnisses und eines Zip zusammen ist ebenso kurz, und für mich zumindest noch einfacher. Wissen Sie, wie sich die Leistung mit der Karte vergleichen lässt? –

0

Mögliche enumerate zu verwenden, aber auch:

[[y,airports[x]] for x,y in enumerate(cities)] 
Verwandte Themen