How do I iterate through two lists in parallel?
for-loop, iterator, list, python
Solution
Python 3
for f, b in zip(foo, bar):
print(f, b)
`zip` stops when the shorter of `foo` or `bar` stops.
In Python 3, `zip` returns an iterator of tuples, like `itertools.izip` in Python2. To get a list of tuples, use `list(zip(foo, bar))`. And to zip until both iterators are exhausted, you would use itertools.zip_longest.
Python 2
In Python 2, `zip` returns a list of tuples. This is fine when `foo` and `bar` are not massive. If they are both massive then forming `zip(foo,bar)` is an unnecessarily massive temporary variable, and should be replaced by `itertools.izip` or `itertools.izip_longest`, which returns an iterator instead of a list.
import itertools
for f,b in itertools.izip(foo,bar):
print(f,b)
for f,b in itertools.izip_longest(foo,bar):
print(f,b)
`izip` stops when either `foo` or `bar` is exhausted. `izip_longest` stops when both `foo` and `bar` are exhausted. When the shorter iterator(s) are exhausted, `izip_longest` yields a tuple with `None` in the position corresponding to that iterator. You can also set a different `fillvalue` besides `None` if you wish. See here for the full story.
Note also that `zip` and its `zip`-like brethen can accept an arbitrary number of iterables as arguments. For example,
for num, cheese, color in zip([1,2,3], ['manchego', 'stilton', 'brie'],
['red', 'blue', 'green']):
print('{} {} {}'.format(num, color, cheese))
prints
1 red manchego
2 blue stilton
3 green brie
Problem
I have two iterables, and I want to go over them in pairs: ``` foo = [1, 2, 3] bar = [4, 5, 6] for (f, b) in iterate_together(foo, bar): print("f:", f, " | b:", b) ``` That should result in: ``` f: 1 | b: 4 f: 2 | b: 5 f: 3 | b: 6 ``` One way to do it is to iterate over the indices: ``` for i in range(len(foo)): print("f:", foo[i], " | b:", bar[i]) ``` But that seems somewhat unpythonic to me. Is there a better way to do it? Related tasks: * How to merge lists into a list of tuples? - given the above `foo` and `bar`, create the list `[(1, 4), (2, 5), (3, 6)]`. * How can I make a dictionary (dict) from separate lists of keys and values? - create the dict `{1: 4, 2: 5, 3: 6}`. * Create a dictionary with comprehension - constructing `dict` using `zip` in a dict comprehension.