通过排列进行筛选
我在做一个项目,发现当我尝试生成很长的排列时,我的程序运行得特别慢,简直是等得花儿都谢了。不过好在我只需要那些以'#'开头和结尾的排列。这里有一个我用来收集排列的函数:
def permut(array):
if len(array) == 1:
return [array]
res = []
for permutation in permut(array[1:]):
for i in range(len(array)):
res.append(permutation[:i] + array[0:1] + permutation[i:])
return res
permut('c#e#')
我只需要的排列是当 array[0] = '#'
和 array[len(s)-1] = '#'
的时候。我很抱歉如果这个问题和之前的类似,但我想知道怎么才能过滤掉那些我不需要的字符串,让我的代码能正常运行,而不是一直卡在那里。
1 个回答
1
从输入中取出两个 #
字符,然后对剩下的部分生成所有可能的排列,最后在生成的排列的两端加上 #
字符。需要注意的是,你可能会发现生成的排列数量还是会多得让你无法一一处理。
顺便提一下,你不需要自己写一个排列生成器。标准库里有一个叫 itertools.permutations
的工具,它比你自己写的代码要快得多,而且还没有你代码中的一些错误。
import itertools
def hash_on_each_end_permutations(array):
array = list(array)
array.remove('#')
array.remove('#')
for subpermutation in itertools.permutations(array):
yield '#' + ''.join(subpermutation) + '#'