Python 字符串的过滤置换

Python 字符串的过滤置换,python,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 per

我要做的是创建一组字符串的排列,其中包含字符串中的
'['
']
。然后,只将由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

问题是,当向字符串中添加更多字符时,可能需要相当长的时间。但我想我知道如何提高速度,以下是我的想法:

创意:

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,]'}
在创建字符串的排列时,不要麻烦将不以
'['
开头并以
']'
结尾的字符串添加/创建到集合中,然后我们可以简单地删除perm函数,该函数循环遍历每个项,并检查字符串是否以
'['
开头并以
']'结尾。
。最后,要检查的项目数量会减少,因此会提高速度

但是,我该如何更改create_perm函数以不创建以“[”开头并以“]”结尾的字符串呢


任何帮助都将不胜感激。如果有比我的想法更好的方法,请让我知道

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

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

只需将它们去掉,就可以生成烫发了

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


这使用而不是递归地生成烫发。

只需将它们去掉,就不需要它们来生成烫发了

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


这使用而不是递归生成烫发。

可能有一种更简单的方法通过利用类似的东西来实现。可能有一种更简单的方法通过利用类似的东西来实现。
def create_perm(lst_str):
    li = list(lst_str.replace('[','').replace(']',''))
    for perm in itertools.permutations(li):
        yield '[{}]'.format(''.join(perm))