itertools
itertools provides fast, memory-efficient iterator building blocks - chaining, slicing, combinatorics, and grouping without intermediate lists.
Search across all documentation pages
itertools provides fast, memory-efficient iterator building blocks - chaining, slicing, combinatorics, and grouping without intermediate lists.
from itertools import chain, islice, product
flat = chain([1, 2], [3, 4])
first_three = list(islice(range(10), 3))
pairs = list(product(["A", "B"], [1, 2]))When to reach for this:
islice on infinite counterfrom itertools import chain, groupby, islice, accumulate
def group_sorted(rows: list[tuple[str, int]]):
for key, group in groupby(rows, key=lambda r: r[0]):
yield key, sum(v for _, v in group)
def paginate(iterator, page_size: int):
page = 0
while True:
chunk = list(islice(iterator, page_size))
if not chunk:
break
yield page, chunk
page += 1
def running_totals(values):
return accumulate(values)
if __name__ == "__main__":
rows = [("a", 1), ("a", 2), ("b", 3)]
print(list(group_sorted(sorted(rows))))
print(list(paginate(iter(range(7)), 3)))
print(list(running_totals([1, 2, 3, 4])))What this demonstrates:
groupby needs sort by same key function firstislice takes from any iterator without len()paginate pattern for streaming APIsaccumulate yields running reductions (default sum)| Function | Purpose |
|---|---|
chain | Concatenate iterables |
islice | Slice iterator |
groupby | Consecutive grouping |
product | Cartesian product |
zip_longest | Zip unequal lengths |
from itertools import pairwise # 3.10+
for a, b in pairwise([1, 2, 3]):
print(a, b)sorted(data, key=key) first.product(count(), repeat=2) never ends. Fix: islice bound.| Alternative | Use When | Don't Use When |
|---|---|---|
| nested for loops | Two small iterables | Many combinations - itertools clearer |
| list comprehensions | Materialize small result | Large cross product |
| pandas groupby | DataFrame analytics | Plain Python tuples |
| more-itertools | Extra recipes (chunked) | Stdlib-only constraint |
groupby only groups adjacent equal keys - sorting clusters equal keys together.
islice works on iterators without random access or len().
chain for known iterables at once; yield from for generator delegation with protocol.
Lazy - generates tuples on demand. Materializing huge product explodes memory.
accumulate(values, func=operator.mul) for running product etc.
stdlib 3.10+ - else zip(items, items[1:]) pattern.
Like map but unpacks tuple args - starmap(pow, [(2,3), (3,2)]).
Opposite of filter - elements where pred false.
Need two passes over iterator without storing all - pays buffer memory.
combinations order-insensitive subsets; permutations order matters.
Stack versions: This page was written for Python 3.14.0 (stable 3.14, maintenance 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, and uv 0.6+.
Reviewed by Chris St. John·Last updated Jul 16, 2026