Ros*_*itt 2 python iteration generator cartesian-product
我正在尝试获得多个数组的笛卡尔积,但数组非常大,我正在尝试优化内存使用。我尝试使用下面的代码实现一个生成器,但它只是返回在某个位置有一个生成器。
import itertools
x = [[1,2],[3,4]]
def iter_tools(*array):
yield list(itertools.product(*array))
print(iter_tools(*x))
Run Code Online (Sandbox Code Playgroud)
当我尝试相同的代码但用return而不是yield它工作正常时。如何通过实现生成器来获得笛卡尔积?
底线,itertools.product已经是一个迭代器。你不需要自己写。(生成器是一种迭代器。)例如:
>>> x = [[1, 2], [3, 4]]
>>> p = itertools.product(*x)
>>> next(p)
(1, 3)
>>> next(p)
(1, 4)
Run Code Online (Sandbox Code Playgroud)
现在,解释一下,您似乎误解了一些基本知识。生成器函数返回生成器迭代器。这就是你从印刷品中看到的:
>>> iter_tools(*x)
<generator object iter_tools at 0x7f05d9bc3660>
Run Code Online (Sandbox Code Playgroud)
使用list()投一个迭代器列表。
>>> list(iter_tools(*x))
[[(1, 3), (1, 4), (2, 3), (2, 4)]]
Run Code Online (Sandbox Code Playgroud)
请注意它是如何嵌套列表的。那是因为您只iter_tools生成一个列表,然后再生成其他列表。在这一点上,这部分没有意义,因为转换itertools.product为列表违背了迭代器惰性求值的全部目的。如果你真的想从迭代器中产生值,你可以使用yield from:
def iter_tools(*array):
yield from itertools.product(*array)
Run Code Online (Sandbox Code Playgroud)
在这种情况下iter_tools是没有意义的,但如果您的实际iter_tools情况更复杂,这可能就是您真正想要的。
也可以看看:
这个答案部分基于juanpa.arrivillaga的评论