Найти в Дзене

Программирование на языке Python. Библиотека itertools и комбинаторика

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes, любители языка Python. Не забывайте подписываться и писать свои
комментарии к моим статьям и видео.

Python, комбинаторные алгоритмы | programmer's notes (python and more) | Дзен
Сортировки на языке Python | programmer's notes (python and more) | Дзен

Использование возможностей библиотеки itertools для решения комбинаторных задач

Библиотека itertools это библиотека разных итераторов. Сегодня будем говорить только об итераторах, связанных с комбинаторикой. У нас уже целый набор комбинаторных алгоритмов накопился. А вот теперь оказывается можно их и не знать. Такая жизнь. Программисты перестают быть алгоритмистами. Слава богу, что я в молодости не застал это время. Ну да ладно. А вот алгоритмистам всё равно нужно знать библиотеку itertools. И так, сегодня только о комбинаторных итераторах. Об остальном поговорим в одной из следующих статей.

Комбинаторные методы библиотеки itertools создают итератор, а как пользоваться им мы знаем. Не так ли?

itertools, генерируем перестановки

Программа генерирует перестановки

#!/usr/bin/python3
import itertools as it
# генерация перестановок
ls = [1, 2, 3]
print(*[t for t in it.permutations(ls)], sep='\n')

Результат выполнения

(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)

itertools, генерируем сочетания

Для генерации сочетаний используется метод combinations().

#!/usr/bin/python3
import itertools as it
# генерация сочетаний
ls = [1, 2, 3, 4]
print(*[t for t in it.combinations(ls, 2)], sep='\n')

Результат выполнения

(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)

Есть ещё один метод combinations_with_replacement(). Он генерирует сочетания с совпадениями.

#!/usr/bin/python3
import itertools as it
# генерация сочетаний с совпадениями
ls = [1, 2, 3, 4]
print(*[t for t in it.combinations_with_replacement(ls, 2)], sep='\n')

Результат выполнения

(1, 1)
(1, 2)
(1, 3)
(1, 4)
(2, 2)
(2, 3)
(2, 4)
(3, 3)
(3, 4)
(4, 4)

itertools, генерируем размещения

Для генерации размещений используется всё тот метод permutations(), но со вторым параметром.

#!/usr/bin/python3
import itertools as it
# генерация размещений
ls = [1, 2, 3]
print(*[t for t in it.permutations(ls, 2)], sep='\n')

Результат выполнения

(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)

itertools, генерируем подмножества

Для генерации подмножеств специального метода нет, но мы легко справимся с этой проблемой

#!/usr/bin/python3
import itertools as it
# генерация подмножеств
ls = [1, 2, 3, 4]
sb = [[t for t in it.combinations(ls, i)] for i in range(len(ls) + 1)]
print(*sb, sep='\n')

Результат выполнения

[()]
[(1,), (2,), (3,), (4,)]
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
[(1, 2, 3, 4)]

itertools, имитируем вложенные циклы

Ну и последний в этой статье метод product(). С помощью него можно имитировать вложенные циклы, значительно сокращая объём программы.

#!/usr/bin/python3
import itertools as it
# имитация вложенных циклов
ls1 = [1, 2]
ls2 = [10, 20]
ls3 = [100, 200]
print(*[t for t in it.product(ls1, ls2, ls3)], sep='\n')

Результат выполнения

(1, 10, 100)
(1, 10, 200)
(1, 20, 100)
(1, 20, 200)
(2, 10, 100)
(2, 10, 200)
(2, 20, 100)
(2, 20, 200)

Ну с itertools на сегодня всё, но только на сегодня.

Следующая статья по комбинаторике на Python...

Предыдущая статья по комбинаторике на Python...

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Попробуйте пойти сразу с туза, а не с тройки
Попробуйте пойти сразу с туза, а не с тройки