Функции itertools.product и enumerate в Python: полный разбор для ЕГЭ

Функции itertools.product и enumerate в Python: полный разбор для ЕГЭ

Когда вы решаете задание №8 или любую задачу на перебор комбинаций, рано или поздно возникает вопрос: как не писать пять, шесть или восемь вложенных циклов?
Ответ — использовать две функции из стандартной библиотеки Python:
  • itertools.product — заменяет вложенные циклы.
  • enumerate — даёт нумерацию элементов.
В этой статье мы разберём обе функции по отдельности, а потом покажем, как они работают вместе.

Часть 1. Функция itertools.product

1.1. Что это такое

product — это функция из библиотеки itertools, которая создаёт все возможные комбинации элементов из заданных последовательностей.
Проще говоря, она делает то же самое, что вложенные циклы, но записывается одной строкой.

1.2. Как подключить

from itertools import product

1.3. Синтаксис

product(последовательность, repeat=количество)
  • последовательность — строка, список или другой набор элементов, из которых строятся комбинации.
  • repeat — сколько раз нужно взять эту последовательность (то есть длина комбинации).

1.4. Пример без repeat

Если repeat не указан, product перебирает все пары элементов из двух последовательностей:
from itertools import product

for tup in product("АБ", "12"):
    print(tup)
Вывод:
('А', '1')
('А', '2')
('Б', '1')
('Б', '2')
Порядок такой же, как при двух вложенных циклах:
for x in "АБ":
    for y in "12":
        print((x, y))

1.5. Пример с repeat

Чаще всего на ЕГЭ нужно перебрать комбинации из одной и той же последовательности несколько раз. Для этого используется repeat.
from itertools import product

for tup in product("АБ", repeat=3):
    print(tup)
Вывод:
('А', 'А', 'А')
('А', 'А', 'Б')
('А', 'Б', 'А')
('А', 'Б', 'Б')
('Б', 'А', 'А')
('Б', 'А', 'Б')
('Б', 'Б', 'А')
('Б', 'Б', 'Б')
Всего 2³ = 8 комбинаций. Это то же самое, что три вложенных цикла:
for x1 in "АБ":
    for x2 in "АБ":
        for x3 in "АБ":
            print((x1, x2, x3))

1.6. Важно: product возвращает кортежи

Обратите внимание: product возвращает кортежи, а не строки. Если вы хотите работать со строкой, нужно её собрать:
from itertools import product

for tup in product("АБ", repeat=3):
    x = ''.join(tup)
    print(x)
Вывод:
ААА
ААБ
АБА
АББ
БАА
БАБ
ББА
БББ
Метод ''.join(tup) склеивает кортеж в строку. Без него вы не сможете использовать методы строки (например, .count()).

1.7. Почему это удобно

Сравните:
Сравнение вложенных циклов и product
Чем длиннее слово, тем больше выигрыш от product.

Часть 2. Функция enumerate

2.1. Что это такое

enumerate — это функция, которая добавляет нумерацию к элементам последовательности.
Она возвращает пары: (номер, элемент).

2.2. Синтаксис

enumerate(последовательность, start=начало_нумерации)
  • последовательность — то, что перебираем.
  • start — с какого числа начинать нумерацию. По умолчанию с 0.

2.3. Пример без start

fruits = ["яблоко", "банан", "вишня"]
for i, fruit in enumerate(fruits):
    print(i, fruit)
Вывод:
0 яблоко
1 банан
2 вишня

2.4. Пример с start=1

На ЕГЭ нумерация часто начинается с 1 (как в задании №8). Для этого используется start=1:
fruits = ["яблоко", "банан", "вишня"]
for i, fruit in enumerate(fruits, start=1):
    print(i, fruit)
Вывод:
1 яблоко
2 банан
3 вишня

2.5. Где это нужно на ЕГЭ

В задании №8 слова нумеруются с 1. Если использовать enumerate без start=1, нумерация начнётся с 0, и все номера сдвинутся на единицу. Ответ будет неверным.
Поэтому в таких задачах всегда пишем:
for c, tup in enumerate(product(s, repeat=5), start=1):

Часть 3. Совместное использование

Вот как обе функции работают вместе в задании №8:

from itertools import product

s = "АЕКНТЦ"
not_s = "АЕК"

for c, tup in enumerate(product(s, repeat=5), start=1):
    x = ''.join(tup)
    if (c % 2 == 0) and (tup[0] not in not_s) and ('Т' in x):
        print(c, x)
        break
Что здесь происходит:
  1. product(s, repeat=5) создаёт все комбинации из 5 букв.
  2. enumerate(..., start=1) добавляет к каждой комбинации её номер, начиная с 1.
  3. c — это номер комбинации.
  4. tup — это кортеж из букв.
  5. x = ''.join(tup) превращает кортеж в строку.
  6. Условие проверяет: номер чётный, первая буква не из not_s, в слове есть Т.
  7. break останавливает цикл после первого найденного слова.

Часть 4. Частые ошибки

Ошибка 1. Забыли ''.join(tup)

for c, tup in enumerate(product(s, repeat=5), start=1):
    if tup.count("Т") >= 1:   # Ошибка! У кортежа нет метода count
Исправление:
for c, tup in enumerate(product(s, repeat=5), start=1): 
    x = ''.join(tup)
    if x.count("Т") >= 1:

Ошибка 2. Забыли start=1

for c, tup in enumerate(product(s, repeat=5)):   # Нумерация с 0
Если в задаче нумерация с 1, все номера сдвинутся на единицу. Ответ будет неверным.
Исправление:
for c, tup in enumerate(product(s, repeat=5), start=1):

Ошибка 3. Перепутали порядок букв

Функция product перебирает комбинации в том порядке, в котором буквы записаны в строке. Если в условии алфавитный порядок А, Е, К, Н, Т, Ц, то и в строке должно быть "АЕКНТЦ", а не "АКЦЕНТ".
Исправление: всегда смотрим на начало списка в условии и выписываем буквы в правильном порядке.

Ошибка 4. break не останавливает всё

Если вы используете вложенные циклы, break выходит только из самого внутреннего. С product такой проблемы нет — там только один цикл, и break останавливает всё.

Часть 5. Плюсы и минусы

Сравнение вложенных циклов и product с enumerate
Когда выбирать product:
  • слово длинное (5 и больше букв);
  • нужно остановиться на первом найденном;
  • нужно нумеровать комбинации.
Когда выбирать вложенные циклы:
  • слово короткое (3–4 буквы);
  • хочется видеть каждый шаг перебора;
  • вы только начинаете разбираться с перебором.

Где это используется

Нужна помощь с подготовкой?

Я — Олег Алексеевич, репетитор по информатике. Готовлю к ЕГЭ более 15 лет.

На своих занятиях мы:

  • разбираем структуру экзамена и стратегии решения;
  • пишем код на Python так, чтобы он работал с первого раза;
  • отрабатываем сложные задания 26 и 27 на реальных примерах.

Хотите попробовать? Запишитесь на первое занятие — познакомимся, определим ваш уровень и составим план подготовки.

Переходите на мой сайт, чтобы узнать подробности и записаться: Репетиторы рядом

Made on
Tilda