Модуль itertools: инструменты итерации

Модуль itertools: инструменты итерации

Модуль itertools — коллекция быстрых и памятеэффективных инструментов для работы с итерируемыми объектами. Функции из itertools возвращают итераторы (не списки), поэтому не создают данные в памяти до момента потребления. Это важно при работе с большими последовательностями.

Счётчик и повторение

import itertools

# count(start, step) — бесконечная арифметическая прогрессия:
for n in itertools.count(1, 2):
    if n > 10:
        break
    print(n, end=" ")
# 1 3 5 7 9

# repeat(value, times) — повторить значение N раз:
result = list(itertools.repeat("X", 5))
print(result)   # ['X', 'X', 'X', 'X', 'X']

# cycle(iterable) — бесконечное циклическое повторение:
colors = itertools.cycle(["R", "G", "B"])
for _ in range(7):
    print(next(colors), end=" ")
# R G B R G B R

chain — объединение последовательностей

chain объединяет несколько итерируемых в одну без создания нового списка:

import itertools

a = [1, 2, 3]
b = [4, 5]
c = [6, 7, 8, 9]

combined = list(itertools.chain(a, b, c))
print(combined)   # [1, 2, 3, 4, 5, 6, 7, 8, 9]

# chain.from_iterable — если у вас список списков:
nested = [[1, 2], [3, 4], [5, 6]]
flat = list(itertools.chain.from_iterable(nested))
print(flat)   # [1, 2, 3, 4, 5, 6]

islice — срез итератора

islice работает как срез списка [start:stop:step], но для любого итератора:

import itertools

numbers = range(100)
first_five = list(itertools.islice(numbers, 5))
print(first_five)   # [0, 1, 2, 3, 4]

# islice(iterable, start, stop, step):
every_third = list(itertools.islice(range(20), 0, 20, 3))
print(every_third)  # [0, 3, 6, 9, 12, 15, 18]

product и permutations

product — декартово произведение (все комбинации), аналог вложенных циклов:

import itertools

# Все возможные пары:
pairs = list(itertools.product([1, 2], ["a", "b"]))
print(pairs)
# [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]

# Эквивалент вложенного for:
# [(x, y) for x in [1, 2] for y in ["a", "b"]]

combinations и permutations — комбинаторика:

import itertools

items = [1, 2, 3]

# Перестановки (порядок важен):
for p in itertools.permutations(items, 2):
    print(p, end=" ")
# (1, 2) (1, 3) (2, 1) (2, 3) (3, 1) (3, 2)

print()

# Комбинации (порядок неважен):
for c in itertools.combinations(items, 2):
    print(c, end=" ")
# (1, 2) (1, 3) (2, 3)

groupby — группировка

groupby группирует последовательные элементы с одинаковым ключом (данные должны быть отсортированы):

import itertools

data = [
    {"name": "Алиса", "dept": "HR"},
    {"name": "Борис", "dept": "HR"},
    {"name": "Вера",  "dept": "IT"},
    {"name": "Глеб",  "dept": "IT"},
]

data.sort(key=lambda x: x["dept"])
for dept, group in itertools.groupby(data, key=lambda x: x["dept"]):
    names = [p["name"] for p in group]
    print(f"{dept}: {names}")
# HR: ['Алиса', 'Борис']
# IT: ['Вера', 'Глеб']

Проверь себя

Что вернёт list(itertools.chain([1, 2], [3], [4, 5]))?

chain объединяет все элементы по порядку: [1, 2, 3, 4, 5].

Итог

  • chain(*iterables) — последовательное объединение; chain.from_iterable — из списка списков.
  • islice(it, stop) — взять первые N элементов из итератора.
  • product(a, b) — декартово произведение; combinations / permutations — комбинаторика.
  • groupby(it, key) — группировка соседних элементов по ключу (нужна предварительная сортировка).
  • Все функции возвращают итераторы — эффективны по памяти.

Модуль 9 завершён. В следующем модуле перейдём к файлам: чтение, запись, работа с путями, CSV и JSON.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике