
Как получить все возможные комбинации элементов в Python?
Наиболее эффективный способ получить все возможные комбинации элементов в Python — это использовать модуль itertools
и входящую в него функциию permutations()
.
Почему стоит использовать модуль itertools?
Модуль itertools
содержит функции, упрощающие работу с итераторами. Основное преимущество этого модуля заключается в эффективном использовании памяти, что позволяет получить нужный результат за минимальное время.
Синтаксис функции permutations()
import itertools itertools.permutations(lst, length = None)
Параметрами функции являются:
lst
— это итерируемая последовательность (например: список, кортеж, строка)lengh
— это длина возвращаемых кортежей (необязательный параметр). Еслиlength = None
, то для перестановок будут использоваться все элементы итератора.
Ниже мы рассмотрим варианты получения всех возможных перестановок для списка и строки:
- Получим все перестановки элементов списка lst = [1, 2, 3]
- Получим все возможные сочетания букв в слове «кот»
- Получим комбинации из двух элементов списка lst = [1, 2, 3]
- Получим сочетания из двух букв слова «кот»
Код для получения всех комбинаций элементов в Python (длина комбинаций = числу элементов)
1. Получим все перестановки элементов списка lst = [1, 2, 3]:
import itertools
nums = [1, 2, 3]
permutations = list(itertools.permutations(nums))
print(permutations)
Вывод на экран:
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
В рассматриваемой задаче мы получаем комбинации, содержащие все элементы списка, поэтому можно не указывать значение второго аргумента для функции permutations().
2. Получим все возможные сочетания букв в слове «кот»:
import itertools
word = "кот"
# получим списки из перестановок букв
letters = list(itertools.permutations(word))
# объединим списки с буквами в слова
permutations = [ ''.join(i) for i in letters ]
print(permutations)
Вывод на экран:
['кот', 'кто', 'окт', 'отк', 'тко', 'ток']
Пояснения к коду:
С помощью кода list(itertools.permutations(word))
мы получаем список с кортежами из букв «к», «о» и «т», расположенных в разном порядке:
letters = [('к', 'о', 'т'), ('к', 'т', 'о'), ('о', 'к', 'т'), ('о', 'т', 'к'), ('т', 'к', 'о'), ('т', 'о', 'к')].
Так как мы получаем комбинации, содержащие все три буквы слова «кот», значение второго аргумента для функции permutations() можно не указывать. Теперь чтобы объединить кортежи из букв в слова, для каждого кортежа i из списка letters вызовем метод ''.join(i)
, объединяющий кортеж в строку. Вместо генератора списков permutations = [ ''.join(i) for i in letters ]
можно организовать перебор элементов списка letters с помощью цикла for. Это также рабочий способ, хоть и более динный:
import itertools
word = "кот"
# получим списки из перестановок букв
letters = list(itertools.permutations(word))
permutations = []
for i in letters:
permutations.append(''.join(i))
print(permutations)
Вывод на экран:
['кот', 'кто', 'окт', 'отк', 'тко', 'ток']
Код для получения комбинаций из n элементов: (длина комбинаций < числа элементов итератора)
1. Получим комбинации из двух элементов списка lst = [1, 2, 3] :
import itertools
lst = [1, 2, 3]
res = list(itertools.permutations(lst, 2))
print(res)
Вывод на экран:
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
Пояснения к коду: так как нам нужно получить комбинации из двух элементов списка lst
, то в качестве второго аргумента функции permutation()
мы передаем значение 2.
2. Получим сочетания из двух букв слова «кот»:
import itertools
word = "кот"
letters = list(itertools.permutations(word, 2))
res = [''.join(i) for i in letters]
print(res)
Вывод на экран:
['ко', 'кт', 'ок', 'от', 'тк', 'то']
Пояснения к коду:
Так как мы получаем комбинации двух букв слова «кот», то в качестве второго аргумента функции permutations()
передаем значение 2.
В результате выполнения кода: list(itertools.permutations(word, 2))
мы получим список letters, состоящий из кортежей: [('к', 'о'), ('к', 'т'), ('о', 'к'), ('о', 'т'), ('т', 'к'), ('т', 'о')]
. После этого мы объединяем элементы кортежей в строки с помощью метода ''.join(i)
. Метод join()
будем вызывать для каждого кортежа, входящего в letters. Объединение букв — элементов кортежей можно также организовать в цикле for. Тогда код будет выглядеть немного иначе:
import itertools
word = "кот"
letters = itertools.permutations(word, 2)
res = []
for i in letters:
res.append(''.join(i))
print(res)
Вывод на экран:
['ко', 'кт', 'ок', 'от', 'тк', 'то']
У нас появился Telegram-канал для изучающих Python! Присоединяйтесь: вместе «питонить» веселее! 😉 Ссылка на канал: «Кодим на Python!»