2010-04-02 91 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