问题输入:两个列表[1,2,3]
和[4,5,6]
输出:以 [1,2,3]
排列开头,后跟 [4,5,6]
排列的列表
示例输出为 [1,2,3,4,5,6]
、[3,2,1,4,5,6]
、[3,2,1,6,5,4]
等。我想使用生成器循环它们。
我尝试使用以下脚本(Python3):
from itertools import permutations
def foo():
perm_1 = permutations([1,2,3])
perm_2 = permutations([4,5,6])
for p1 in perm_1:
for p2 in perm_2:
yield list(p1) + list(p2)
f = foo()
for ls in f:
print(ls)
作为输出,我得到
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 6, 5]
[1, 2, 3, 5, 4, 6]
[1, 2, 3, 5, 6, 4]
[1, 2, 3, 6, 4, 5]
[1, 2, 3, 6, 5, 4]
如您所见,第一个列表的排列从未被使用,例如输出 [3,2,1,4,5,6] 从未产生。
最佳答案
这里的问题是,一旦迭代,perm2
将为空。
因此,在外部 for
循环的第一次迭代中,一切都很好。然而,在接下来的迭代中,perm2
将只是空的。
在这里查看一个更简单的示例:
>>> from itertools import permutations
>>> a = permutations([1,2,3])
>>> list(a)
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
>>> list(a)
[]
要解决此问题,请将 perm_2
替换为 permutations([4,5,6])
(另一种解决方案可能是在存储时将 perm_2
转换为 list
,但我认为将所有内容保留在生成器中更为惯用)
关于Python 生成器函数和排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64788087/