Skip to main content

Python itertools: Powerful Tools for Working with Iterables

Advanced30 min7 exercises105 XP
0/7 exercises

Imagine you have a Swiss Army knife for loops. Instead of writing complicated nested loops and temporary lists, you pull out the right tiny tool and the job is done in one clean line.

That's what `itertools` is. It's a standard library module packed with functions that create efficient iterators for looping. They're memory-friendly because they produce items one at a time instead of building huge lists.

In this tutorial, you'll learn the most useful itertools functions: chain, product, permutations, combinations, islice, takewhile/dropwhile, groupby, and accumulate. Each one replaces several lines of manual loop code.

How Does chain Combine Multiple Iterables?

Sometimes you have several lists and you want to loop through all of them as if they were one big list. You could concatenate them with +, but that creates a whole new list in memory. chain just connects them end-to-end without copying anything.

Chaining multiple lists together
Loading editor...

If you have a list of lists (a nested list), use chain.from_iterable() to flatten it into a single sequence.

Flattening a list of lists
Loading editor...

What Is the Cartesian Product and When Do You Need It?

Have you ever made a table of all possible combinations? Like pairing every shirt color with every pants color? That's a Cartesian product. Instead of writing nested loops, product() does it for you.

All color-size combinations
Loading editor...

The repeat parameter lets you take the product of an iterable with itself. This is useful for things like generating all possible dice rolls or binary strings.

Product with repeat
Loading editor...
Nested loops (manual)
combos = []
for x in [1, 2]:
    for y in ['a', 'b']:
        combos.append((x, y))
print(combos)
itertools.product (clean)
from itertools import product
combos = list(product([1, 2], ['a', 'b']))
print(combos)

How Do permutations and combinations Differ?

Think of a locker combination. With permutations, the order matters: 1-2-3 is different from 3-2-1. With combinations, the order doesn't matter: picking cards {A, K, Q} is the same no matter which order you drew them.

Permutations: order matters
Loading editor...
Combinations: order does not matter
Loading editor...

Notice that permutations gives both ('A', 'B') and ('B', 'A'), while combinations only gives ('A', 'B'). Permutations always produces more results because each arrangement counts as different.

There's also combinations_with_replacement() which allows the same item to appear more than once. Think of it like scooping ice cream where you can pick the same flavor twice.

Combinations with replacement
Loading editor...

How Can You Slice Iterators with islice, takewhile, and dropwhile?

You can slice a list with my_list[2:5], but you can't slice an iterator that way. islice lets you grab a portion of any iterator without converting it to a list first.

Slicing iterators with islice
Loading editor...

takewhile grabs items from the start of a sequence as long as a condition is true. The moment the condition fails, it stops. dropwhile is the opposite: it skips items while the condition is true, then gives you everything after.

takewhile and dropwhile
Loading editor...

How Does groupby Organize Data into Groups?

groupby groups consecutive items that share the same key. Think of sorting a deck of cards by suit: you go through the deck and group consecutive cards that are the same suit.

Grouping animals by type
Loading editor...
Grouping words by length
Loading editor...

What Does accumulate Do with Running Totals?

accumulate produces running totals (or running results of any function). Think of a bank account: you start with a balance, and each transaction adds to or subtracts from the running total.

Running sum with accumulate
Loading editor...

You can pass a custom function to accumulate. For example, you can compute a running maximum or running product.

Custom accumulate functions
Loading editor...

Practice Exercises

Flatten a Nested List
Write Code

Use chain.from_iterable to flatten the nested list [[1, 2], [3, 4], [5, 6]] into a single flat list. Print the result.

Loading editor...
Generate All Coin Flip Outcomes
Write Code

Use product to generate all possible outcomes of flipping a coin 3 times. The coin has sides 'H' and 'T'. Print each outcome tuple on its own line.

Loading editor...
Find All 2-Letter Permutations
Write Code

Use permutations to find all 2-letter arrangements from the letters ['X', 'Y', 'Z']. Convert the result to a list and print it.

Loading editor...
Predict the takewhile Output
Predict Output

What does this code print? Remember that takewhile stops at the FIRST item that fails the condition.

from itertools import takewhile
nums = [1, 3, 5, 2, 4, 7]
result = list(takewhile(lambda x: x < 5, nums))
print(result)
Loading editor...
Compute a Running Total
Write Code

Use accumulate to compute the running total of [10, 20, 30, 40, 50]. Convert to a list and print it.

Loading editor...
Group Numbers as Even or Odd
Write Code

Given numbers = [1, 3, 2, 4, 5, 7, 6, 8], sort them by whether they're even or odd, then use groupby to print each group. Use lambda x: x % 2 == 0 as the key. Print in the format:

False: [1, 3, 5, 7]

True: [2, 4, 6, 8]

Loading editor...
Fix the groupby Bug
Fix the Bug

This code tries to group words by first letter, but the output is wrong because the data isn't sorted. Fix the code so it correctly groups all words by their first letter.

Expected output:

a: ['ant', 'ape']

b: ['bat', 'bee']

c: ['cat', 'cow']

Loading editor...