Python中的嵌套生成器函数
考虑一个元组 v = (a,b,c)
和一个生成器函数 generate(x)
,这个函数会接收元组中的一个元素,并为每个元素生成多个选项。
那么,如何用Python的方式生成所有可能的组合,基于 generate(x)
对元组中每个元素的结果呢?
我可以这样做:
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
但是这样看起来太丑了,而且我需要一个通用的解决方案。
1 个回答
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
根据文档的说明:
这个函数可以计算输入的可迭代对象(比如列表、元组等)的笛卡尔积。
它的作用就像是嵌套的 for 循环在生成器表达式中的表现。例如,调用 product(A, B) 的结果和 ((x,y) for x in A for y in B) 是一样的。