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)) # 6combinations()
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)) # 6combinations_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 — локальная установка не требуется.
Все уроки этого курса
- itertools: бесконечные и конечные итераторы
- itertools: комбинаторика
- functools: partial и reduce
- functools: lru_cache и cached_property