itertools для генерации всех возможных комбинаций и перестановок.Теория и основные понятия
Что проверяется:
- Знание принципов кодирования информации, систем счисления и комбинаторики.
- Умение считать количество возможных комбинаций, перестановок и произведений.
- Навык чтения и отладки программ на Python, работающих с вложенными циклами и генераторами.
📘 Основные формулы
- Если каждая из
Lпозиций может быть заполненаnспособами:
N = nL - Если выбор каждой позиции зависит от разных наборов вариантов:
N = n₁ × n₂ × … × nL - Если в программе
Lвложенных циклов с длинамиn₁, n₂, …,
то внутренний блок выполняетсяN = n₁ × n₂ × … × nLраз.
📗 Алфавит и слова
Если в алфавите M символов, то число всех возможных «слов» длиной N равно:
Q = MN.
📙 Вероятностные формулы
Вероятность одного из двух событий:
p = n / (m + n)
Количество информации по Шеннону:
I = −log₂(p)
📘 Модуль Python itertools
Модуль предназначен для работы с итераторами и комбинаторными задачами.
product()— декартово произведение (все возможные слова заданной длины).permutations()— перестановки (размещения без повторений).combinations()— сочетания (без повторений).
from itertools import product, permutations, combinations
print(list(product('ABC', repeat=2)))
# [('A','A'), ('A','B'), ('A','C'), ('B','A'), ('B','B'), ('B','C'), ('C','A'), ('C','B'), ('C','C')]
print(list(permutations('ABCD', 3)))
# [('A','B','C'), ('A','C','B'), ...]
print(list(combinations('ABCDE', 3)))
# [('A','B','C'), ('A','B','D'), ('A','B','E'), ...]
Что повторить
Разбор типовых заданий
🅰 Задание 1. Составление кодовых слов
Условие:
Игорь использует трёхбуквенные слова из букв Ш, К, О, Л, А, причём буква К встречается ровно 1 раз.
Остальные буквы могут повторяться.
Решение:
- Буква
Кможет стоять на одной из трёх позиций → 3 варианта. - Две другие буквы выбираются из 4 возможных (Ш, О, Л, А):
4² = 16. - Итого:
3 × 16 = 48.
Python-код:
from itertools import product
words = [x for x in product('ШКОЛА', repeat=3) if x.count('К') == 1]
print(len(words)) # 48
Ответ: 48.
🅱 Задание 2. Перестановки с ограничениями
Условие:
Маша составляет шестибуквенные слова из букв слова КАПКАН, избегая двух подряд одинаковых букв.
Решение:
Используем itertools.permutations, отбрасывая слова с АА или КК.
from itertools import permutations
words = {p for p in permutations('КАПКАН')
if 'АА' not in ''.join(p) and 'КК' not in ''.join(p)}
print(len(words))
Ответ: 96.
🆎 Задание 3. Условия для мягкого знака
Условие:
Маша составляет 5-буквенные коды из букв В, У, А, Л, Ь.
Каждую букву нужно использовать один раз. Буква Ь не может быть на первом месте и стоять перед гласной.
Python-решение:
from itertools import permutations
w = {x for x in permutations('ВУАЛЬ', 5)
if 'ЬА' not in ''.join(x)
and 'ЬУ' not in ''.join(x)
and ''.join(x)[0] != 'Ь'}
print(len(w)) # 36
Ответ: 36 кодов.
🧩 Задание 4. Слова без запрещённого сочетания
Условие:
Вася составляет 4-буквенные коды из букв У, Л, Е, Й.
Код не может начинаться с Й и содержать сочетание ЕУ.
from itertools import permutations
w = {x for x in permutations('УЛЕЙ', 4)
if 'ЕУ' not in ''.join(x)
and ''.join(x)[0] != 'Й'}
print(len(w))
Ответ: 12.
🧮 Задание 5. Алфавит и обязательная буква
Условие:
Вася составляет 3-буквенные слова из букв В, Е, С, Н, А, причём буква А встречается хотя бы один раз.
Решение:
from itertools import product
words = [x for x in product('ВЕСНА', repeat=3) if x.count('А') >= 1]
print(len(words)) # 61
Ответ: 61.
💾 Задание 6. Подсчёт по условию
Условие:
Сколько существует последовательностей длиной 5 из букв A, C, G, T, содержащих ровно две буквы A?
from itertools import product
w = [x for x in product('ACGT', repeat=5) if x.count('A') == 2]
print(len(w)) # 60
Ответ: 60.
🔢 Задание 7. Позиция слова в списке
Все 4-буквенные слова из К, Л, Р, Т упорядочены алфавитно. Найти 67-е слово.
from itertools import product
w = list(product('КЛРТ', repeat=4))
print(''.join(w[67 - 1])) # КЛТК
🧠 Задание 8. Обратный алфавитный порядок
Все 5-буквенные слова из А, О, У расположены в обратном алфавитном порядке (У → О → А). Найти 240-е слово.
from itertools import product
w = list(product('УОА', repeat=5))
print(''.join(w[240 - 1])) # УОААО
💡 Задание 9. Комбинаторика
Алфавит из 4 символов. Сколько трёхбуквенных слов можно составить, если символы могут повторяться?
from itertools import product
w = list(product('ABCD', repeat=3))
print(len(w)) # 4³ = 64
Ответ: 64.
💡 Задание 10. Световое табло
Каждый индикатор имеет 4 цвета (белый, синий, жёлтый, красный).
Найти минимальное количество лампочек для передачи ≥300 сигналов.
for n in range(1, 10):
if 4**n >= 300:
print(n)
break # 5
Ответ: 5 лампочек.
🧾 Задание 11. Шахматная клетка
Необходимо закодировать координаты (x, y), каждая из которых может принимать 8 значений.
Количество бит на одну координату: log₂(8) = 3.
Итого для двух координат: 3 + 3 = 6 бит.
📻 Задание 12. Азбука Морзе
Коды длиной от 2 до 4 сигналов (точка/тире). Найти количество возможных комбинаций.
from itertools import product
cnt = 0
for i in range(2, 5):
cnt += len(list(product('01', repeat=i)))
print(cnt) # 28
Ответ: 28 символов.
Вводные задания
- С помощью генератора, создайте список из чисел от 1 до 100
- С помощью генератора, создайте список из квадратных корней чисел от 1 до 100
- Заполните список с помощью генератора случайными символами русского алфавита.
- С помощью генератора, создайте список из всех возможных перестановок букв Р, У, К, А, В
- Дан список [‘б’, ‘е’, ‘р’, ‘к’, ‘с’, ‘о’, ‘б’, ‘е’, ‘н’].
- Преобразовать список двумя способами: в строку с разделителем — пробелом.
- В строку без разделителей между символами в обратном порядке по сравнению с позицией символов в списке.
- Доработайте задание 4. Генератор списка должен формировать элементы списка – строки, а не кортежи. Посчитайте количество слов в списке, которые начинаются на букву А. В задании запрещено использовать циклы. Смотреть разбор
- Составьте все возможные слова длиной 4 из букв Б, О, К, С, Ё, Р. Смотреть разбор
- Составьте все возможные слова длиной 3 и 4 из букв Б, О, К, С, Ё, Р. Вторя буква обязательно должна быть гласной. Смотреть разбор.
- Составьте все возможные слова перестановкой букв в слове «АККУРАТНО». Требуется исключить варианты с двумя идущими подряд одинаковыми буквами. Смотреть разбор. Вариант 2
- Составьте все возможные слова длиной 5 букв из букв В, У, А, Л, Ь. Мягкий знак не должен идти первым и находиться после гласных букв.
- Все пятибуквенные слова из букв К, О, Н, Ф, Е, Т, А отсортированы в алфавитном порядке по убыванию. На каком месте находится слово «ТОНЕТ»? Смотреть разбор
- Все четырех и пятибуквенные слова из алфавита «АБВГДЕ» отсортированы по длине и алфавиту в порядке возрастания. Все слова не содержат в третьей позиции букву «Е» и сочетания букв «ГВ» в любой позиции. На какой позиции расположено слово «БАГДА»
Задания для подготовки
Простые
- https://kompege.ru/task?id=7
- https://kompege.ru/task?id=52
- https://kompege.ru/task?id=91
- https://kompege.ru/task?id=195
- https://kompege.ru/task?id=199 Смотреть разбор
- https://kompege.ru/task?id=265 Смотреть разбор
Средние
- https://inf-ege.sdamgia.ru/problem?id=69913 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=3193 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=59832 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=15626 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=40724 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=13459 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=69886 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=76223 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=76111 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=68241 Смотреть разбор
- https://kompege.ru/task?id=19240 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=26982 Смотреть разбор
- https://kompege.ru/task?id=21894 Смотреть разбор
- https://kompege.ru/task?id=21703 Смотреть разбор Вариант 2
- https://education.yandex.ru/ege/variants/31d08c52-c86e-4487-b7e4-6f7435f63344/task/8?utm_term=kege Смотреть разбор
Сложные
- https://inf-ege.sdamgia.ru/problem?id=72566 Смотреть разбор Вариант 2
- https://kompege.ru/task?id=11635 Смотреть разбор
- https://kompege.ru/task?id=11203
- https://kompege.ru/task?id=6537
- https://kompege.ru/task?id=4562
- https://kompege.ru/task?id=3074
- https://kompege.ru/task?id=20271
- https://kompege.ru/task?id=11330
- https://kompege.ru/task?id=10921
- https://kompege.ru/task?id=7696
- https://kompege.ru/task?id=5873
- https://kompege.ru/task?id=5699
- https://kompege.ru/task?id=5663
- https://kompege.ru/task?id=5655
- https://kompege.ru/task?id=5430
- https://kompege.ru/task?id=5301
- https://kompege.ru/task?id=5300
- https://kompege.ru/task?id=5299
- https://kompege.ru/task?id=4564
- https://kompege.ru/task?id=4561
- https://kompege.ru/task?id=4560
- https://kompege.ru/task?id=4359
- https://kompege.ru/task?id=3086
- https://kompege.ru/task?id=2517
- https://kompege.ru/task?id=1920
- https://kompege.ru/task?id=1688
- https://kompege.ru/task?id=1687
- https://kompege.ru/task?id=1686
- https://kompege.ru/task?id=1363
- https://kompege.ru/task?id=1339
- https://kompege.ru/task?id=460
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7767
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7741
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7740
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7739
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7697
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7092
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7091
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7090
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6345
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6344
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6343
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6342
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6272
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6157
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6156
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6155
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6154
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6153
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6146
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6145
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6144
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6132
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6131
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6130
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6129
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6128
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6112
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6097
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5907
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5906
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5760
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5759
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5758
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5757
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5756
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5755
- https://education.yandex.ru/ege/inf/task/bd950175-911e-45cb-8d54-820d5d281042
- https://education.yandex.ru/ege/inf/task/1769ee78-deec-48be-a248-12165baef040
- https://education.yandex.ru/ege/inf/task/310d22e7-bde6-4f5c-99ff-3d2861ebf37a
- https://education.yandex.ru/ege/inf/task/f7b3e564-4a77-4925-a995-3fd1df3171c0
- https://education.yandex.ru/ege/inf/task/20078fed-349c-4f9c-b342-5a76f39910fd
- https://education.yandex.ru/ege/inf/task/d9fba00a-a921-4c70-9597-0b458fbf17f0
- https://education.yandex.ru/ege/inf/task/de7eace6-8794-4d1b-b0fd-c7c42cff77d5
- https://education.yandex.ru/ege/inf/task/08a16fb2-3773-4f00-8961-cfa21b2e65a9
- https://education.yandex.ru/ege/inf/task/ae97ab85-969c-401a-b0aa-38efd2a6ac5f
- https://education.yandex.ru/ege/inf/task/b19825e6-aafc-48ed-9bd7-99033090c53c
- https://education.yandex.ru/ege/inf/task/9e6dd0d9-26fd-4eb9-a0e4-26994d401db5
- https://education.yandex.ru/ege/inf/task/57def1bb-965c-46f2-ab36-a9c134a4cb7c
- https://education.yandex.ru/ege/inf/task/03e8c8cb-8142-4918-8016-b8599705ab85
- https://education.yandex.ru/ege/inf/task/d73b5f1e-ee81-4928-94f5-ea2abff0a9a0
- https://education.yandex.ru/ege/inf/task/cbb14800-c05b-493b-a516-966f6ec3dc32
- https://education.yandex.ru/ege/inf/task/ddce5ec5-c1e4-4e47-94a2-f5e19c7519dd
- https://education.yandex.ru/ege/inf/task/c66a1998-8288-47b1-8172-eb5509452f3b
- https://education.yandex.ru/ege/inf/task/ec685268-8ab8-419d-a89e-b1ca5ff7d8b7
- https://education.yandex.ru/ege/inf/task/9267f73d-71f1-4ca5-8b55-b3a4e18c9228
- https://education.yandex.ru/ege/inf/task/7bd50bb2-d36b-496b-b363-393b9ac6cb4b
- https://education.yandex.ru/ege/inf/task/45fd2b37-8ef4-40a0-8dc5-5dfea52424b1
- https://education.yandex.ru/ege/inf/task/25b07cf2-f5d0-437e-bbe6-b97de75b9ac2
- https://education.yandex.ru/ege/inf/task/a835b02e-7ae7-480c-a0cf-866d4a013e09
- https://education.yandex.ru/ege/inf/task/cf899119-5ce5-4245-b13a-33214cacb8e9
- https://education.yandex.ru/ege/inf/task/e680d278-78ba-4399-b8e4-d90c7e4b2d4e
- https://education.yandex.ru/ege/inf/task/c67c47cd-fe62-4f67-b789-13aa7ebcd307
- https://education.yandex.ru/ege/inf/task/6f7a985f-c404-4ebe-a856-f7ed7e6d5b46
