Все комбинации размещения символов в строке - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь сделать что-то, где у меня есть слово, скажем, «искра», и я нахожу все возможные варианты этого слова со словом «*». Например, "S ****", "SPAR *", "SP * R *". Любые идеи о том, как я мог бы сделать это в python

1 Ответ

4 голосов
/ 02 мая 2020

Вот один из способов сделать это:

import itertools
s = "SPARK"
r = ["".join(c if x else '*' for c, x in zip(s, t)) \
     for t in itertools.product((True, False), repeat=len(s))]

Это дает r следующее значение:

['SPARK', 'SPAR*', 'SPA*K', 'SPA**', 'SP*RK', 'SP*R*', 'SP**K',
 'SP***', 'S*ARK', 'S*AR*', 'S*A*K', 'S*A**', 'S**RK', 'S**R*',
 'S***K', 'S****', '*PARK', '*PAR*', '*PA*K', '*PA**', '*P*RK',
 '***RK', '***R*', '****K', '*****']

Это работает следующим образом: Верхний уровень - это понимание списка. Внешний l oop понимания использует itertools.product, который производит повторяющиеся связывающие кортежи значений True и False. Каждый кортеж соответствует записи в конечном результате, где значение True соответствует букве от s, а значение False соответствует '*'.

Внутренний l oop производит список отдельных символов. Он перебирает zip(s, t), что объединяет буквы s со значениями True / False в кортеже t. Для каждой пары, если x (значение из t) равно True, выбирается c (буква из s). В противном случае он выбирает '*'.

Буквы в каждом списке отдельных символов объединяются в строки с "".join(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...