gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:23:02 25 4
gpt4 key购买 nike

这个 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() 实现的解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61049172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com