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 以简化代码并集中讨论
我理解什么上面的代码(它的输出),但我正在寻找如何它工作的解释。我已经熟悉列表理解,包括嵌套 for
s.
这个特别令人费解:
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)]
因此,对于池中的每个元组,它遍历中间结果中的每个子列表,并将每个项目添加到当前池中每个项目的子列表中。请注意,它是创建新列表。
这个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 以简化代码并集中讨论
我理解什么上面的代码(它的输出),但我正在寻找如何它工作的解释。我已经熟悉列表理解,包括嵌套 for
s.
这个特别令人费解:
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)]
因此,对于池中的每个元组,它遍历中间结果中的每个子列表,并将每个项目添加到当前池中每个项目的子列表中。请注意,它是创建新列表。