2010-06-11 65 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