通过排列进行筛选

1 投票
1 回答
989 浏览
提问于 2025-04-17 22:30

我在做一个项目,发现当我尝试生成很长的排列时,我的程序运行得特别慢,简直是等得花儿都谢了。不过好在我只需要那些以'#'开头和结尾的排列。这里有一个我用来收集排列的函数:

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) + '#'

撰写回答