如何从函数获取两个同步生成器适配itertools.product
问题描述
我有如下嵌套元组:
this_one = (w,h,(1,2,4,8,16),(0,2,3,4,6),("0"),("0"),(0,1))
需要将其传入:
itertools.product(*this_one)
其中w和h都必须是生成器,且h的生成值依赖w的生成值,逻辑如下:
def This_Function(maxvalue): for i in range(maxvalue): w_must_generate = i for j in range(i+1): h_must_generate = j
我尝试用yield实现该生成器:
def This_Function(maxvalue): for i in range(maxvalue): for j in range(i+1): yield i,j
但这样返回的是单个生成器对象,导致itertools.product的输出结果第一个元素是包含两个值的元组,不符合需求。我希望w和h的生成值作为结果中的独立元素,且不想事后拆分处理结果,请问有什么解决办法?
解决方案
因为w和h存在依赖关系,无法拆分为两个独立的生成器供itertools.product直接使用,所以需要换一种思路:先生成所有符合逻辑的(w, h)配对,再将每个配对与后面固定元素的笛卡尔积结果拼接,最终得到符合要求的独立元素结构。
具体实现代码
import itertools def generate_wh(maxvalue): # 生成所有符合依赖关系的w和h配对 for i in range(maxvalue): for j in range(i+1): yield i, j # 提取元组中除w、h外的固定元素部分 fixed_elements = ((1,2,4,8,16), (0,2,3,4,6), "0", "0", (0,1)) # 生成最终结果:遍历每个(w,h)配对,再遍历固定元素的笛卡尔积,拼接成完整元组 maxvalue = 3 # 根据实际需求设置maxvalue final_result = ((w, h) + rest for w, h in generate_wh(maxvalue) for rest in itertools.product(*fixed_elements)) # 验证输出 for item in final_result: print(item)
说明
generate_wh负责生成所有满足依赖关系的w和h组合;- 通过嵌套遍历,先拿到一组
(w, h),再遍历固定元素的笛卡尔积结果rest,将(w, h)与rest拼接成一个完整元组,这样每个结果中的w和h都是独立元素,无需事后拆分; - 这种方式完全替代了原计划中直接将
w、h作为独立参数传入itertools.product的逻辑,同时满足依赖关系和输出结构要求。
内容的提问来源于stack exchange,提问作者On4r4p
相关产品推荐
相关产品推荐

