Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用生成器在Python中获得笛卡尔积?_Python_Iteration_Generator_Cartesian Product - Fatal编程技术网

如何使用生成器在Python中获得笛卡尔积?

如何使用生成器在Python中获得笛卡尔积?,python,iteration,generator,cartesian-product,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)) 当我尝试相同的代码,但使用return而不是yield时,效果很好。如何通过实现生成器来获得笛卡尔乘积?如果

我试图得到多个数组的笛卡尔积,但是数组非常大,我试图优化内存使用。我尝试使用下面的代码实现一个生成器,但它只是返回在某个位置有一个生成器

import itertools

x = [[1,2],[3,4]]

def iter_tools(*array):
    yield list(itertools.product(*array))

print(iter_tools(*x))

当我尝试相同的代码,但使用
return
而不是
yield
时,效果很好。如何通过实现生成器来获得笛卡尔乘积?

如果要从笛卡尔乘积中生成单个项,需要迭代该乘积:

import itertools

x = [[1,2],[3,4]]

def iter_tools(*array):
    for a in itertools.product(*array):
        yield a

for a in iter_tools(*x):
    print(a)


生成器的思想是,您不需要同时进行所有计算,就像您在调用
列表(itertools.product(*array))
时一样。所以你要做的就是一个接一个地生成结果。例如:

def iter_工具(*数组):
对于数组[0]中的i:
对于数组[1]中的j:
收益率(i,j)
然后可以对每个结果元组执行如下操作:

iter_工具(*x)中的tup的
:
打印(tup)
当然,您可以很容易地调整生成器,使其在每次调用中生成每行或每列

或者,如果您对itertools提供的服务感到满意:

itertools.product(*x)中i的
:
印刷品(一)

您需要什么取决于您的用例。希望我能帮助您:)

总之,
itertools.product
已经是一个很好的工具了。你不需要自己写。(A是一种迭代器。)例如:

>>> x = [[1, 2], [3, 4]]
>>> p = itertools.product(*x)
>>> next(p)
(1, 3)
>>> next(p)
(1, 4)

现在,解释一下,你似乎误解了一些基本的东西。生成器函数返回一个值。这就是你从照片上看到的:

>>> iter_tools(*x)
<generator object iter_tools at 0x7f05d9bc3660>

请注意它是如何嵌套的列表。这是因为你的
iter\u工具
只会产生一个列表,而不会产生其他列表。在这一点上,这一部分毫无意义,因为将
itertools.product
强制转换到列表中违背了迭代器的全部目的。如果您确实希望从迭代器中生成值,则可以使用
yield from

def iter_tools(*array):
    yield from itertools.product(*array)
在这种情况下,
iter\u工具
是没有意义的,但如果实际的
iter\u工具
更复杂,这可能就是您实际想要的

另见:



这个答案的部分依据是,您的生成器立即实现了整个产品,从而破坏了整个目的。无论如何,
itertools.product(*array)
已经是一个高效的迭代器。没有必要把它包在发电机里。所以只需使用
itertools.product(*array)
。发电机工作,发电机功能返回发电机。看来你有一个根本性的误解。@juanpa谢谢!我发布的部分内容是基于您的评论。
itertools.product
已经是一个迭代器,这使得这个
iter\u工具
毫无意义。
def iter_tools(*array):
    yield from itertools.product(*array)