【问题标题】:Using itertools.product in place of double-nested for loop in Python 3在 Python 3 中使用 itertools.product 代替双嵌套 for 循环
【发布时间】:2016-11-16 16:08:05
【问题描述】:

以下代码有效,但显得冗长。

def gen(l):
    for x in range(l[0]):
        for y in range(l[1]):
            for z in range(l[2]):
                yield [x, y, z]
l = [1, 2, 3]
print(list(gen(l)))

>>>[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], [0, 1, 2]]

我的意图是通过 itertools.product 减少 LOC。这就是我想出的。

from itertools import product
def gen(l):
    for x, y, z in product(map(range, l)):
        yield [x, y, z]
l = [1, 2, 3]
print(list(gen(l)))

ValueError: not enough values to unpack (expected 3, got 1)

是否有不同的方法来使用 itertools.product 以便有足够的值来解压?

【问题讨论】:

    标签: python python-3.x generator itertools cartesian-product


    【解决方案1】:

    您需要将map 迭代器的元素与* 分开传递给product

    for x, y, z in product(*map(range, l))
    

    顺便说一句,通过另一个 map 调用,您可以节省另一行,跳过 Python 生成器的开销,并在 C 中完成所有工作:

    def gen(l):
        return map(list, product(*map(range, l)))
    

    【讨论】:

    • 使用星号分隔元素效果很好,但答案的第二部分返回 TypeError: 'int' object is not iterable。
    • @CannedSpinach:这不应该发生。我确实错过了它返回元组的迭代器而不是列表(您可以通过另一个 map 调用 fix),但即使是带有元组的版本 doesn't raise a TypeError
    猜你喜欢
    • 1970-01-01
    • 2020-12-22
    • 2022-01-14
    • 2023-02-05
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多