Dubon Dubon - 1 year ago 52
Python Question

Iterating over two lists one after one

I have two lists

of numbers, and I want to iterate over them with the same instructions. Like this:

for item in list1:
for item in list2:

But thats feels redundant. I know I can write
for item in list1 + list2:
, but It has a price of running-time.

Is there a way do that without loose time?

Jim Jim
Answer Source

This can be done with itertools.chain:

import itertools

l1 = [1, 2, 3, 4]

l2 = [5, 6, 7, 8]

for i in itertools.chain(l1, l2):
    print(i, end = " ")

Which will print:

1 2 3 4 5 6 7 8 

As per the documentation, chain does the following:

Make an iterator that returns elements from the first iterable until it is exhausted, then proceeds to the next iterable, until all of the iterables are exhausted.

If you have your lists in a list, itertools.chain.from_iterable is available:

l = [l1, l2]
for i in itertools.chain.from_iterable(l):
    print(i, end= " ")

Which yields the same result.

If you don't want to import a module for this, writing a function for it is pretty straight-forward:

def custom_chain(*it):
    for iterab in it:
        yield from iterab

This requires Python 3, for Python 2, just yield them back using a loop:

def custom_chain(*it):
    for iterab in it:
        for val in iterab:
            yield val

In addition to the previous, Python 3.5 with its extended unpacking generalizations, also allows unpacking in the list literal:

for i in [*l1, *l2]:
    print(i, end=' ')