如何将Python itertools生成的元组列表转为内嵌字典列表或适配原有SQL逻辑
方案1:转换为字典列表(适配原有代码,无需修改后续逻辑)
你可以直接通过列表推导式+内置的zip函数完成转换,不需要手动拼接,扩展性极强,新增属性只需要同步修改属性名列表和product的入参即可:
from itertools import product # 运算符元组定义保持原有写法即可 tc = ("=", ">", "<") dr = ("=", ">", "<") bd = ("=", ">", "<") fr = ("=", ">", "<") ch = ("=", ">", "<") # 按product入参顺序定义对应的属性名 attr_keys = ["tc", "dr", "bd", "fr", "ch"] # 直接生成和原有结构一致的字典列表 permutations = [dict(zip(attr_keys, item)) for item in product(tc, dr, bd, fr, ch)]
生成的permutations和你之前手动append的字典列表结构完全一致,后续生成SQL的代码不需要做任何修改就能直接使用。
方案2:直接解包元组(性能最优,代码更简洁)
itertools.product返回的元组顺序和你传入参数的顺序严格对应,不需要转字典,直接在遍历时解包即可,省掉了构造字典、查询字典的额外开销,是更优的选择:
from itertools import product tc = ("=", ">", "<") dr = ("=", ">", "<") bd = ("=", ">", "<") fr = ("=", ">", "<") ch = ("=", ">", "<") # 遍历直接解包元组,变量顺序和product入参顺序保持一致即可 for tc_op, dr_op, bd_op, fr_op, ch_op in product(tc, dr, bd, fr, ch): criteria = (f"a.f1 {tc_op} b.f1 AND " f"a.f2 {dr_op} b.f2 AND " f"a.f3 {bd_op} b.f3 AND " f"a.f4 {fr_op} b.f4") # 其余业务逻辑保持不变
选型建议
- 如果你原有项目中大量逻辑依赖字典格式的
permutations,改造成本高,选方案1即可,性能足够满足你的使用场景(几千条组合的转换开销可以忽略) - 如果可以小改遍历逻辑,优先选方案2,代码更简洁,性能也更好,后续新增属性只要在解包时加对应变量、SQL里加对应条件即可。
内容的提问来源于stack exchange,提问作者evand
相关产品推荐
相关产品推荐

