gzhegow
@gzhegow
aka "ОбнимиБизнесмена"

Комбинаторика — Как собрать все перестановки/комбинации (permutations/combinations) из двух разных групп?

Нашел в библиотеке python itertools код, который делает все возможные пересечения (combinations) в рамках одной группы. Также есть код, который делает все возможные перестановки в рамках одной группы (permutations);

Я не совсем понимаю, как поочередно используя эти два метода получить перестановки всех элементов, при условии, что нужно брать элементы из двух разных групп?

Практическое применение - slugger.

Есть буквосочетание например "ый". Нужно заменить его на такое же в ASCII, условно "iy".

Соотвественно нужно получить такие перестановки:
Группа 1: ы, Ы
Группа 2: й, Й
Ожидаемый результат: ый ыЙ Ый ЫЙ

Можно написать просто цикл в два уровня и получить то что нужно.
Интересно как это можно сделать, через "стандартные" функции комбинаторики.

Если я использую функцию комбинаторики для всех 4 букв, на выходе будут в том числе пересечения ыЫ йЙ и подобные.

То есть цель - понять как они применяются эти функции.

Правильно ли я понимаю, что моя задача больше похожа на комбинации, т.к. перестановки предполагают, что буквы меняются местами, а у меня вроде как нет.
И второе - методика работы с этими функциями - выбрать все пересечения и отбросить не-подходящие по критерию? Или стоит писать еще одну свою функцию, которая позволяет передать несколько групп, чтобы их перекрестно соединять избегая неверных значений?
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
@PavelMos
Если я использую функцию комбинаторики для всех 4 букв, на выходе будут в том числе пересечения ыЫ йЙ и подобные.
Т.к. важно условие что сочетаться могут только разные буквы, но не заглавная и маленькая одной и той же буквы, имхо можно делать признак b, m (большая, маленькая или 1,0) для N-столбцов.

Тогда это будет размещение с повторениям из двух элементов (большая, маленькая для такой-то позиции, то есть буквы) по N (в данном случай окончание слова из 2 букв).

upd:
это называется декартово произведение списка элементов самого на себя (product позволяет перемножать несколько списков) с заданным числом повторов
list(itertools.product('mB',repeat=3))
Out[9]: 
[('m', 'm', 'm'),
 ('m', 'm', 'B'),
 ('m', 'B', 'm'),
 ('m', 'B', 'B'),
 ('B', 'm', 'm'),
 ('B', 'm', 'B'),
 ('B', 'B', 'm'),
 ('B', 'B', 'B')]

А дальше обработать список и на основе номера позиции и значения поставить нужную буквы большую или малую

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
29 сент. 2022, в 11:34
200 руб./за проект
29 сент. 2022, в 10:50
50000 руб./за проект