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.
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.
Possible to use enumerate
, as well:
[[y,airports[x]] for x,y in enumerate(cities)]
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.
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
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))