我试图通过一个字符串,每次我遇到一个星号(*
)替换它与字母表中的每个字母。一旦这样做了,另一个星号被击中,在两个位置再次做同样的事情,以此类推。如果可能的话,将这些排列保存到.txt文件中,或者直接打印出来。这是我现有的,我不知道该怎么做:
alphabet = "abcdefghijklmnopqrstuvwxyz"
for i in reversed("h*l*o"):
if i =="*":
for j in ("abcdefghijklmnopqrstuvwxyz"):
对的,我对下面的一些解决方案有更多的挑战,我正在尝试使用。
- 我无法写入文件,因为我只是得到错误。
您可以:
count
字符串中星号的数量。- 创建与(1)中相同重复次数的所有字母的
product
。 - 将每个星号(按顺序)替换为对应的字母:
import string
import itertools
s = "h*l*o"
num_of_asterisks = s.count('*')
for prod in itertools.product(string.ascii_lowercase, repeat=num_of_asterisks):
it = iter(prod)
new_s = ''.join(next(it) if c == '*' else c for c in s)
print(new_s)
指出:
- 而不是创建所有字母的字符串,只是使用
string
模块。 - 这将产品的元组转换为迭代器,以便于处理每个字母的顺序替换。
- 使用
join
方法从输入字符串中创建新的字符串。 上面的代码只是打印每个排列。当然,您可以将其替换为写入文件或其他任何您想要的内容。
有趣的问题。我想你指的是笛卡尔积,而不是"排列"。
我会使用itertools:
string = "h*l*o"
import itertools
# for every combination of N letters
for letters in itertools.product(alphabet, repeat=string.count('*')):
# iterate over the letters
letter_iter = iter(letters)
# replace every * with the next instance
print(''.join(i if i!='*' else next(letter_iter) for i in string))