|I l@ve RuBoard|
1.15 Looping Through Multiple Lists
Credit: Andy McKay
There are basically three approaches. Say you have:
a = ['a1', 'a2', 'a3'] b = ['b1', 'b2']
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 built-in 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.
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: 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 built-ins in the Library Reference.
|I l@ve RuBoard|