0Pricing
Python Academy · Урок

itertools: комбинаторика

Генерируйте перестановки, сочетания и декартовы произведения.

«itertools: комбинаторика» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Обзор комбинаторики

itertools предоставляет четыре комбинаторные функции: product, permutations, combinations и combinations_with_replacement.

import itertools

# All orderings of 2 items from ABC
print(list(itertools.permutations("ABC", 2)))
# [(A,B),(A,C),(B,A),(B,C),(C,A),(C,B)]

product()

product(*iterables, repeat=1) вычисляет декартово произведение — это эквивалентно вложенным циклам.

import itertools

print(list(itertools.product([1,2], ["a","b"])))
# [(1,"a"),(1,"b"),(2,"a"),(2,"b")]

# repeat=2 pairs each element with itself
print(list(itertools.product(range(2), repeat=2)))
# [(0,0),(0,1),(1,0),(1,1)]

permutations()

permutations(it, r) выдаёт все упорядоченные наборы длины r. Общее количество: P(n,r) = n!/(n-r)!.

import itertools

result = list(itertools.permutations([1,2,3], 2))
print(result)
# [(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)]
print(len(result))  # 6

combinations()

combinations(it, r) выдаёт все неупорядоченные выборки длины r без повторений. Общее количество: C(n,r) = n!/(r!(n-r)!).

import itertools

result = list(itertools.combinations([1,2,3,4], 2))
print(result)
# [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
print(len(result))  # 6

combinations_with_replacement()

combinations_with_replacement(it, r) позволяет одному элементу появляться в комбинации более одного раза.

import itertools

result = list(itertools.combinations_with_replacement("AB", 2))
print(result)
# [(A,A),(A,B),(B,B)]

Подсчёт без создания всех элементов

Используйте math.perm, math.comb или сокращённую запись len() (она работает для конечных результатов), вместо того чтобы создавать все элементы только ради их подсчёта.

import math

print(math.perm(10, 3))   # 720
print(math.comb(10, 3))   # 120

Генерация паролей и ключей

Комбинаторные итераторы полезны для создания возможных ключей или тестовых случаев без загрузки всех данных в память.

import itertools, string

chars = string.ascii_lowercase
# All 2-char lowercase combos:
for combo in itertools.combinations(chars, 2):
    pass  # process without materialising

Координаты сетки с помощью product

Используйте product(range(rows), range(cols)), чтобы обходить двумерную сетку без вложенных циклов.

import itertools

for row, col in itertools.product(range(3), range(3)):
    print(f"({row},{col})", end=" ")

Проверка всех подмножеств

Сгенерируйте все подмножества списка, перебирая combinations для каждой длины от 0 до n.

import itertools

items = [1, 2, 3]
all_subsets = []
for r in range(len(items)+1):
    all_subsets.extend(itertools.combinations(items, r))
print(all_subsets)

Удаление дубликатов с помощью combinations

Используйте combinations, чтобы сравнить каждую пару элементов ровно один раз и избежать повторных сравнений (a,b) и (b,a).

import itertools

words = ["apple","apricot","banana","blueberry"]
for a, b in itertools.combinations(words, 2):
    if a[0] == b[0]:
        print(f"Same letter: {a}, {b}")

Особенности производительности

Комбинаторные последовательности очень быстро растут. permutations(range(12)) создаёт 479 миллионов результатов. Всегда используйте генераторы и создавайте в памяти только необходимые данные.

import itertools, math

n = 12
print(f"P(12,12) = {math.factorial(n):,}")   # 479,001,600
# Never: list(itertools.permutations(range(12)))
# Instead: iterate lazily and break early

Быстрая проверка

Какая функция itertools создаёт все неупорядоченные пары без повторений из коллекции?

Итоги

Используйте product для декартовых произведений, permutations для упорядоченных наборов, combinations для неупорядоченных подмножеств, а combinations_with_replacement, когда элементы могут повторяться. Всегда обрабатывайте комбинаторные итераторы лениво.

Часто задаваемые вопросы

Урок «itertools: комбинаторика» бесплатный?

Да — полный текст урока «itertools: комбинаторика» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «itertools: комбинаторика»?

Генерируйте перестановки, сочетания и декартовы произведения. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «itertools: комбинаторика»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. itertools: бесконечные и конечные итераторы
  2. itertools: комбинаторика
  3. functools: partial и reduce
  4. functools: lru_cache и cached_property
← Назад к Python Academy