tags:

views:

215

answers:

4

I'm a Python newbie and one of the things I am trying to do is wrap my head around list comprehension. I can see that it's a pretty powerful feature that's worth learning.

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

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

How do I use list comprehension so I can get the results as a series of lists within a list, rather than a series of tuples within a list?

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

(I realize that dictionaries would probably be more appropriate in this situation, but I'm just trying to understand lists a bit better). Thanks!

+12  A: 

Something like this:

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

Alternately, the list constructor can convert tuples to lists:

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

Or, the map function is slightly less verbose in this case:

map(list, zip(cities, airports))
Greg Hewgill
A: 

This takes zip's output and converts all tuples to lists:

map(list, zip(cities, airports))

As for the performance of each:

$ 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
Wim
-1: The OP specifically asked for a list comprehension.
Edan Maor
+4  A: 

A list comprehension, without some help from zip, map, or itertools, cannot institute a "parallel loop" on multiple sequences -- only simple loops on one sequence, or "nested" loops on multiple ones.

Alex Martelli
It can be done as Dave Kirby has demonstrated
inspectorG4dget
+1  A: 

If you wanted to do it without using zip at all, you would have to do something like this:

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

but there is no reason to do that other than an intellectual exercise.

Using map(list, zip(cities, airports)) is shorter, simpler and will almost certainly run faster.

Dave Kirby
On the other hand, using a list comprehension and a zip together is just as short, and to me at least, even simpler. Do you happen to know how it's performance would compare with map?
Edan Maor