SaltyCrane Blog — Notes on JavaScript and web development

Iterating through two lists in parallel using zip()

From the Python docs, zip returns a list of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables. This is useful for iterating over two lists in parallel. For example, if I have two lists, I can get the first element of both lists, then the second element of both lists, then the third, etc.

Python 2.5.1 (r251:54863, May 18 2007, 16:56:43)
[GCC 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1,2,3]
>>> b = ['a','b','c']
>>> for i,j in zip(a,b):
...     print i, j
1 a
2 b
3 c

If the lists are different lengths, zip truncates to the length of the shortest list. Using map with None is similar to zip except the results are padded with None.

>>> a = [1,2,3]
>>> b = ['a','b','c','d']
>>> zip(a,b)
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> map(None,a,b)
[(1, 'a'), (2, 'b'), (3, 'c'), (None, 'd')]

If I have a list of keys and a list of values, I can create a dictionary by passing the output of zip to dict.

>>> mykeys = ['a', 'b', 'c']
>>> myvalues = [1, 2, 3]
>>> dict(zip(mykeys, myvalues))
{'a': 1, 'c': 3, 'b': 2}

See also this thread on the Python mailing list: Iterating through two lists