2010-06-11 38 views
1

寻找一种模拟嵌套循环(或笛卡尔乘积)的方法,我遇到了itertools.product函数。 我需要一个函数或一段代码接收整数列表作为输入并返回一个特定的生成器。python input for itertools.product

例如:
输入= [3,2,4] - >根=产物(x范围(3),x范围(2),x范围(4))

输入= [2,4, 5,6] - > gen = product(xrange(2),xrange(4),xrange(5),xrange(6))

作为列表的大小变化我很困惑如何做到这一点而不需要基于疯狂的ifs数量和列表大小进行大量的预编码。

调用产品(范围(3))或产品(xrange(3))也有区别吗?

回答

2
def bigproduct(*args): 
    newargs = [xrange(x) for x in args] 
    return itertools.product(*newargs) 

for i in bigproduct(3, 2, 4): 
    .... 

range()生成列表的前期,因此使用时间前面和更多的空间,但需要较少的时间来获得每个元素。 xrange()即时生成每个元素,因此占用更少的空间和初始时间,但需要更多时间才能返回每个元素。

+0

1让我补充两个细节:1)在Python 3,'范围()'行为就像'的xrange()'2)在实施CPython的Python 2的'xrange'仅限于C'long'数据类型(即''xrange(int(2 ** 31-1))'通常是最大范围)。击中那一次... – stephan 2010-06-11 07:59:22

-1

这可以容易地实现用图:

from itertools import product 
for i in product(*map(range, shape)): 
    print i 
+0

什么是'形状'?这是一个numpy特定的参考? – cowbert 2017-01-25 21:35:15

相关问题