如何格式化此功能以便递归工作?如果可能的话,我想要更深层次,而不是直到5。
排列是一个具有不同排列的列表,那些单独的排列也可以有排列等。我想根据我在get_permutations中进行的一些计算对它们进行排名,并返回新的排列顺序。查看它的好方法可能是列表列表列表的大量列表。首先,我想改变第一级的顺序,而不是更深一些等等。但最终我根据这些排列返回字符串而不是排列本身(如果重要),res1 ... res5是字符串。即使我知道它应该是可能的,我也不够聪明,不能让它以递归的方式工作......有什么想法吗?
permutations, res1 = get_permutations(str, 1)
for p2 in permutations:
permutations_2, res2 = get_permutations(p2,2)
for p3 in permutations_2:
permutations_3, res3 = get_permutations(p3,3)
for p4 in permutations_3:
permutations_4, res4 = get_permutations(p4, 4)
for p5 in permutations_4:
permutations_5, res5 = get_permutations(p5,5)
res4 += res5
res3 += res4
res2 += res3
res1 += res2
return res1
编辑:这会返回单个(最佳)排列。这就是结果。因此,不是答案中提到的可能排列的列表。例如。如果我们有一个列表列表,如果首先根据所有子信息对列表进行排序,则根据先前的排序和所有子信息对列表的多个列表进行排序,然后根据前两个排序对列表列表进行排序
答案 0 :(得分:2)
一个递归生成器函数,它根据原始字符串产生预期顺序的排列:
def get_permutations(a):
if len(a) <= 1:
yield a
else:
for i in xrange(len(a)):
for p in get_permutations(a[:i]+a[i+1:]):
yield ''.join([a[i]])+p
>>> a = '123'
>>> list(get_permutations(a))
['123', '132', '213', '231', '312', '321']
这里的递归原则:
基本情况:长度为(0, 1)
的字符串只有一个排列:本身。
递归:对于字符串中的每个字母,将其删除并将其添加到字符串余数的每个排列中。
答案 1 :(得分:0)
下面的示例,此方法通过以递归方式重复循环嵌套for循环来工作。然后我们累积子解决方案的结果,附加到结果列表:
result = []
def permutations(alphabet, repeat, total = ''):
if repeat >= 1:
for i in alphabet:
# Add the subsolutions.
permutations(alphabet, repeat - 1, total + i)
else:
result.append(total)
return result
示例输出:
permutations('ab', 3) ->
$ ['aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bba', 'bbb']
permutations('ab', 3) ->
$ ['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa',
'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab',
'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']
permutations('ab', 1) ->
$ ['a', 'b']