Вот один из способов сделать это:
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(...)
.