1.15 Looping Through Multiple Lists
Credit: Andy McKay
1.15.1 Problem
You need to loop through every item of
multiple lists.
1.15.2 Solution
There are basically three approaches. Say you have:
a = ['a1', 'a2', 'a3']
b = ['b1', 'b2']
Using the builtin function
map, with a first argument
of None, you can iterate on both lists in
parallel:
print "Map:"
for x, y in map(None, a, b):
print x, y
The loop runs three times. On the last iteration,
y will be None.
Using the builtin function zip also lets you
iterate in parallel:
print "Zip:"
for x, y in zip(a, b):
print x, y
The loop runs two times; the third iteration simply is not done.
A list comprehension affords a very different iteration:
print "List comprehension:"
for x, y in [(x,y) for x in a for y in b]:
print x, y
The loop runs six times, over each item of b for
each item of a.
1.15.3 Discussion
Using map with None as the
first argument is a subtle variation of the standard
map call, which typically takes a function as the
first argument. As the documentation indicates, if the first argument
is None, the identity function is used as the
function through which the arguments are mapped. If there are
multiple list arguments, map returns a list
consisting of tuples that contain the corresponding items from all
lists (in other words, it's a kind of transpose
operation). The list arguments may be any kind of sequence, and the
result is always a list.
Note that the first technique returns None for
sequences in which there are no more elements. Therefore, the output
of the first loop is:
Map:
a1 b1
a2 b2
a3 None
zip lets you iterate over
the lists in a similar way, but only up to the number of elements of
the smallest list. Therefore, the output of the second technique is:
Zip:
a1 b1
a2 b2
Python 2.0 introduced list comprehensions, with a syntax that some
found a bit strange:
[(x,y) for x in a for y in b]
This iterates over list
b for every element in a. These
elements are put into a tuple (x,
y). We then iterate through the resulting list of
tuples in the outermost for loop. The output of
the third technique, therefore, is quite different:
List comprehension:
a1 b1
a1 b2
a2 b1
a2 b2
a3 b1
a3 b2
1.15.4 See Also
The Library Reference section on sequence types;
documentation for the zip and
map builtins in the Library
Reference.
