我想做一件事,我有一个单词,比如说 "spark",我想找到这个单词中带有 "*"的所有可能的排列方式,比如 "S***","SPAR*","SP*R*"。例如 "S****", "SPAR*", "SP*R*". 有什么办法可以让我在python中做到这一点吗?
这里有一个方法。
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', '*****']
其工作原理如下: 顶层是一个列表理解。 理解的外部循环使用 itertools.product
,它产生了一个可迭代的数组 True
和 False
值。 每个元组对应于最后结果中的一个条目,其中a True
值对应于一个字母,从 s
和a False
值对应于 '*'
.
内循环产生一个单字符的列表。 它遍历 zip(s, t)
的字母配对,将 s
随着 True
False
元组中的值 t
. 对于每一对,如果 x
(数值来自 t
)是 True
,它选择 c
(信中提到的 s
). 否则会选择 '*'
.
每个单字符列表中的字母用 "".join(...)
.