2010-04-02 93 views
2

考慮一個元組v = (a,b,c)和一個生成器函數generate(x),它從元組接收一個項目併爲每個項目生成幾個選項。Python中嵌套的生成器函數

在元組中的每個項目上生成一組generate(x)的所有可能組合的pythonic方法是什麼?

我可以這樣做:

v = (a,b,c) 
for d in generate(v[0]): 
    for e in generate(v[1]): 
     for f in generate(v[2]): 
      print d,e,f 

不過這只是醜陋的,再加上我需要一個通用的解決方案。

回答

8

Python 2.6中所具有的功能itertools.product(),你想要做什麼:

import itertools 
v = (a, b, c) 
for d, e, f in itertools.product(*(generate(x) for x in v)): 
    print d, e, f 

從文檔:

輸入iterables的笛卡爾乘積。

等效於 生成器表達式中的嵌套for循環。例如, 產品(A,B)返回的結果與 ((x,y)相同)。

+0

看起來很有幫助,我將如何迭代結果? – 2010-04-02 18:35:23

+1

@Yuval:'對於我在產品中(*(在v中爲x生成(x))):do_whatever_you_want(i)' – kennytm 2010-04-02 18:36:09

+0

邪惡。答案已經更新,以反映... – 2010-04-02 18:38:35