【问题标题】:Python generator function and permutationsPython生成器函数和排列
【发布时间】:2021-02-23 12:34:12
【问题描述】:

问题输入:两个列表[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] 从未产生。

【问题讨论】:

    标签: python python-3.x list generator permutation


    【解决方案1】:

    这里的问题是,一旦迭代,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,但我认为将所有内容与生成器一起保存更为惯用)

    【讨论】:

    • 我知道这是一件简单得令人尴尬的事情!
    【解决方案2】:

    我认为它正在发生,因为 itertool 的置换方法在底层实现为生成器函数。由于您使用的是嵌套 for 循环,使用 p1 = (1, 2, 3)perm_2 会生成列表 [4, 5, 6] 中数字的所有可能排列并变得筋疲力尽。不可能多次迭代生成器函数/表达式,这就是为什么循环仅以来自perm_1 的可能排序结束的原因。

    【讨论】:

      【解决方案3】:

      问题出在这里:

      perm_1 = permutations([1,2,3])
      perm_2 = permutations([4,5,6])
      

      一旦你加载了permutations,这将永远不会再次出现在你的 for 循环中。

      试试这个,并将它们中的每一个都作为一个列表:

      perm_1 = list(permutations([1,2,3])) 
      perm_2 = list(permutations([4,5,6])) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-05
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        • 2019-10-22
        • 2013-10-30
        相关资源
        最近更新 更多