Python > Modules and Packages > Standard Library > Working with Iterators (`itertools` module)

Combining Iterables with `itertools.chain`

itertools.chain allows you to treat multiple iterables as a single sequence. It concatenates them sequentially, providing a unified view of their elements.

Basic Usage

This code demonstrates how to use itertools.chain to combine three lists into a single iterator. The resulting iterator yields the elements of list1, then list2, and finally list3. The loop iterates over the combined iterator and prints each element.

import itertools

list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = [7, 8, 9]

combined_iterator = itertools.chain(list1, list2, list3)

for num in combined_iterator:
    print(num)

Concepts Behind the Snippet

The itertools.chain function is a powerful tool for working with multiple iterables as if they were a single one. It's lazy, meaning that it only retrieves elements from the input iterables as they are needed. It doesn't create a new list in memory, making it efficient for large datasets.

Real-Life Use Case

Imagine you have several log files that you need to process in chronological order. Each log file is represented as an iterable. itertools.chain provides a clean way to combine these log files into a single stream of log entries, allowing you to process them sequentially without loading all the data into memory at once.

Best Practices

Ensure that the input to itertools.chain are indeed iterables (lists, tuples, generators, etc.). If you pass non-iterable objects, you will get a TypeError.

When to Use Them

Use itertools.chain when you need to process multiple sequences of data as if they were a single continuous stream. It is particularly useful when dealing with large datasets or when you want to avoid creating a new list by concatenating existing lists.

Memory Footprint

itertools.chain is memory-efficient because it doesn't create a new list containing all the elements. It only holds references to the input iterables and yields elements from them one at a time. This makes it suitable for handling large datasets without exceeding memory limits.

Alternatives

You could achieve a similar result by using list concatenation and a simple loop. For example: list1 = [1, 2, 3] list2 = [4, 5, 6] list3 = [7, 8, 9] combined_list = list1 + list2 + list3 for num in combined_list: print(num) However, this approach creates a new list in memory, which can be inefficient for large lists. itertools.chain avoids this by creating an iterator.

Pros

itertools.chain is memory-efficient and provides a clean, readable way to combine multiple iterables into a single stream. It avoids creating a new list, which can save memory and improve performance for large datasets.

Cons

If you need to modify the combined sequence or access elements by index, itertools.chain might not be the best choice, as it returns an iterator, not a list. In such cases, creating a new list by concatenating the input lists might be more appropriate.

FAQ

  • Can I use `itertools.chain` with generators?

    Yes, itertools.chain works perfectly with generators. It will consume the generators one at a time, yielding their elements sequentially.
  • What happens if one of the iterables passed to `itertools.chain` is empty?

    itertools.chain will simply skip the empty iterable and continue with the next one. It won't raise an error or produce unexpected results.