Python itertools.product() 实现的解释?

Explanation of the Python itertools.product() implementation?

这个Python魔法是如何工作的?

有问题的代码来自Python itertools.product documentation:

def product(*args):
    pools = map(tuple, args)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

注意:是的,我理解这不是实际的实现。此外,我删除了 repeat arg 以简化代码并集中讨论

我理解什么上面的代码(它的输出),但我正在寻找如何它工作的解释。我已经熟悉列表理解,包括嵌套 fors.

这个特别令人费解:

for pool in pools:
    result = [x+[y] for x in result for y in pool]

我试图将上面的代码转换成一系列 for 循环,但没有任何列表理解,但我没有得到正确的结果。这种算法一般需要递归来处理任意数量的输入集。因此,我对上面的代码似乎是迭代地执行此操作感到困惑。

谁能解释一下这段代码是如何工作的?

这里是列表推导转换成常规for循环,如果对你理解有帮助的话:

def product_nocomp(*args):
    pools = map(tuple, args)
    result = [[]]
    for pool in pools:
        _temp = []
        for x in result:
            for y in pool:
                _temp.append(x + [y])
        result = _temp
    for prod in result:
        yield tuple(prod)

这里有一些有启发性的 print

In [9]: def product_nocomp(*args):
   ...:     pools = list(map(tuple, args))
   ...:     result = [[]]
   ...:     print("Pools: ", pools)
   ...:     for pool in pools:
   ...:         print(result, end=' | ')
   ...:         _temp = []
   ...:         for x in result:
   ...:             for y in pool:
   ...:                 _temp.append(x + [y])
   ...:         result = _temp
   ...:         print(result)
   ...:     for prod in result:
   ...:         yield tuple(prod)
   ...:

In [10]: list(product_nocomp(range(2), range(2)))
Pools:  [(0, 1), (0, 1)]
[[]] | [[0], [1]]
[[0], [1]] | [[0, 0], [0, 1], [1, 0], [1, 1]]
Out[10]: [(0, 0), (0, 1), (1, 0), (1, 1)]

因此,对于池中的每个元组,它遍历中间结果中的每个子列表,并将每个项目添加到当前池中每个项目的子列表中。请注意,它是创建新列表