我要做的是创建一组字符串的排列,其中包含字符串中的'['
和']'
。然后,仅添加由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函数而不创建不以'['开头并以']结尾的字符串?
任何帮助将不胜感激。如果有比我的想法更好的方法,请告诉我
答案 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)
为什么不能删除括号,生成结果字符串的所有排列,然后在每个结果周围放置括号?