I l@ve RuBoard Previous Section Next Section

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 built-in 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 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.

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 built-ins in the Library Reference.

    I l@ve RuBoard Previous Section Next Section