过滤字符串的排列

时间:2014-03-19 20:58:32

标签: python

我要做的是创建一组字符串的排列,其中包含字符串中的'['']'。然后,仅添加由create_perm创建的字符串,其中包含'['作为第一个,']'作为新集合的最后一个并返回该集合。

我做了什么:

def create_perm(lst_str):
    if len(lst_str) <= 1:
        return {lst_str}
    old_set = set()
    for idx, c in enumerate(lst_str):
        for perm in create_perm(lst_str[:idx] + lst_str[idx+1:]):
            old_set.add(c + perm)
    return old_set


def perm(lst_str):
    new_set = set()
    for idx in create_perm(lst_str):
        if idx.startswith('[') and idx.endswith(']'):
                new_set.add(idx)
    return new_set

示例:

perm('[1]2')
{'[12]', '[21]'}
perm('[1]23')
{'[123]', '[213]', '[321]', '[312]', '[231]', '[132]'}
perm('[1]2,3')
{'[2,13]', '[3,21]', '[12,3]', '[,213]', '[2,31]', '[,312]', '[1,23]', '[13,2]', '[321,]', '[312,]', '[,132]', '[23,1]', '[123,]', '[,321]', '[1,32]', '[132,]', '[,231]', '[3,12]', '[32,1]', '[21,3]', '[213,]', '[,123]', '[31,2]', '[231,]'}

所以,

首先我创建一个包含'['和']'的字符串的排列:

>>> create_perm('[2,],1')
{',]2,[1', '2,1,][', '2][1,,', ',][2,1', ']2,1,[', ',[,]12', '1,],[2', ',[2,1]', ',[12],', '2[,]1,', '1][,,2', ',,]2[1', '1[2,],', ...}

然后返回一个新集,其中只包含以'['开头并以']

结尾的字符串
>>> perm('[2,],1')
{'[,2,1]', '[2,,1]', '[12,,]', '[1,,2]', '[,12,]', '[,21,]', '[21,,]', '[2,1,]', '[,,21]', '[,1,2]', '[,,12]', '[1,2,]'}

我可以调用perm,这将调用create_perm。

这个问题是,当字符串中添加更多字符时可能需要一段时间。但我想我知道如何提高速度,这就是我的想法:

在创建字符串的排列时,不要费心添加/创建不以'['开头并以']'结尾的字符串到集合中,然后我们可以简单地删除perm函数它循环遍历每个项目并检查字符串是以'['开头还是以']'结尾。最后,检查的物品数量会减少,从而提高速度。

但是我怎么会改变create_perm函数而不创建不以'['开头并以']结尾的字符串?

任何帮助将不胜感激。如果有比我的想法更好的方法,请告诉我

2 个答案:

答案 0 :(得分:4)

将它们剥离,你不需要它们来产生烫发。

def create_perm(lst_str):
    li = list(lst_str.replace('[','').replace(']',''))
    for perm in itertools.permutations(li):
        yield '[{}]'.format(''.join(perm))

演示:

list(create_perm('[1]2,'))
Out[102]: ['[12,]', '[1,2]', '[21,]', '[2,1]', '[,12]', '[,21]']

这使用itertools.permutations而不是递归生成perms。

答案 1 :(得分:1)

为什么不能删除括号,生成结果字符串的所有排列,然后在每个结果周围放置括号?