我正在尝试获取列表中字符的所有可能排列。我需要它来返回列表中所有可能的烫发。列表列表,其中列表的每个组成部分都是一个排列。似乎无法找出问题所在。尝试与列表一起玩,但没有帮助。尝试完成此操作而不导入任何内容。
代码:
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
我也欢迎任何有关如何改进编码风格的提示。
答案 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]