排列函数不以列表形式返回答案

时间:2018-12-04 16:05:36

标签: python python-3.x

我正在尝试获取列表中字符的所有可能排列。我需要它来返回列表中所有可能的烫发。列表列表,其中列表的每个组成部分都是一个排列。似乎无法找出问题所在。尝试与列表一起玩,但没有帮助。尝试完成此操作而不导入任何内容。

代码:

def permutation(lst1, num_of_perms):
    if num_of_perms == len(lst1) - 1:
        print(lst1)

    for i in range(num_of_perms, len(lst1)):
        #  "removes" the first component of the list and returns all
        #  permutations where it is the first letter
        lst1[i], lst1[num_of_perms] = lst1[num_of_perms], lst1[i]
        #  swaps two components of the list each time.
        permutation(lst1, num_of_perms + 1)
        lst1[i], lst1[num_of_perms] = lst1[num_of_perms], lst1[i]
        #  swaps back before the next loop

我也欢迎任何有关如何改进编码风格的提示。

1 个答案:

答案 0 :(得分:0)

返回值和打印值之间有区别,尽管要从交互式解释器中查看是否仅运行该函数可能会比较困难,因为它总是将函数的返回值打印到标准输出中。

最简单的解决方法是使permutation成为生成器函数,因为它仅涉及将print替换为yield。您需要在基本情况下生成列表的副本(否则,当您最终迭代返回值时,您将获得对lst1当时所引用内容的引用,而不是它是您使用yield时引用的。您还需要从递归调用中明确产生值。

def permutation(lst1, num_of_perms):
    if num_of_perms == len(lst1) - 1:
        yield(lst1[:])

    for i in range(num_of_perms, len(lst1)):
        #  "removes" the first component of the list and returns all
        #  permutations where it is the first letter
        lst1[i], lst1[num_of_perms] = lst1[num_of_perms], lst1[i]
        #  swaps two components of the list each time.
        yield from permutation(lst1, num_of_perms + 1)
        lst1[i], lst1[num_of_perms] = lst1[num_of_perms], lst1[i]
        #  swaps back before the next loop

通过这些更改,您可以从生成器本身中列出一个列表:

>>> list(permutation([1,2,3],0))
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]

或一次遍历一个排列

>>> for i, p in enumerate(permutation([1,2,3], 0)):
...   print("{}) {}".format(i, p))
...
0) [1, 2, 3]
1) [1, 3, 2]
2) [2, 1, 3]
3) [2, 3, 1]
4) [3, 2, 1]
5) [3, 1, 2]