Комбинации элементов в Python

Как получить все возможные комбинации элементов в Python?

Как получить все возможные комбинации элементов в Python?

Наиболее эффективный способ получить все возможные комбинации элементов в Python — это использовать модуль itertools и входящую в него функциию permutations().

Почему стоит использовать модуль itertools?

Модуль itertools содержит функции, упрощающие работу с итераторами. Основное преимущество этого модуля заключается в эффективном использовании памяти, что позволяет получить нужный результат за минимальное время.

Синтаксис функции permutations()

import itertools 
itertools.permutations(lst, length = None) 

Параметрами функции являются:

  • lst — это итерируемая последовательность (например: список, кортеж, строка)
  • lengh — это длина возвращаемых кортежей (необязательный параметр). Если length = None, то для перестановок будут использоваться все элементы итератора.

Ниже мы рассмотрим варианты получения всех возможных перестановок для списка и строки:


Код для получения всех комбинаций элементов в 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!»


Добавить комментарий