Python 生成器函数和排列

标签 python python-3.x list generator permutation

问题输入:两个列表[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/

相关文章:

python - 如何在 bazel `creation_time` 中设置 `lang_image`

python - 用更实用的方法替换链接(递归)for 循环

python - 扩展列表返回 None

python - 为什么我不能修改作为函数内部参数传递的列表?

java - 要列出的结果集

java - 作为客户端,如何获取 Stomp 队列或/和主题(它们的名称)列表?

python - Django ValueError 位于/admin/

python - 如何在seaborn distplot 中添加一条垂直线?

python - 在 Python 中初始化二维数组

javascript - 如何存储 Monoidal List 功能链的数据?