如何用itertools.product扩展含元组的字典生成笛卡尔积字典列表
解决字典中元组值的笛卡尔积展开问题
核心思路是拆分固定键值对与可变键值对(元组类型的 value),利用itertools.product对可变项的元素做笛卡尔积组合,最后将每个组合结果与固定项合并成完整字典。
具体实现代码
import itertools params = { 'a': 'static', 'b': (1, 2), 'c': ('X', 'Y') } # 拆分固定项和需做笛卡尔积的键-元素列表 fixed = {} variable_groups = [] for key, value in params.items(): if isinstance(value, tuple): # 为每个含元组的键生成(键, 元素)的列表,供后续组合 variable_groups.append([(key, elem) for elem in value]) else: fixed[key] = value # 生成笛卡尔积并合并所有键值对 result = [] for item_group in itertools.product(*variable_groups): # 复制固定项,避免修改原字典 combined_dict = fixed.copy() # 将当前笛卡尔积组转成字典并合并 combined_dict.update(dict(item_group)) result.append(combined_dict) print(result)
代码说明
- 数据拆分:遍历原字典,非元组值的键值对存入
fixed字典;元组值的键则生成包含(键, 元素)的列表,所有这类列表存入variable_groups。比如示例中variable_groups最终为[[('b',1), ('b',2)], [('c','X'), ('c','Y')]]。 - 笛卡尔积运算:
itertools.product(*variable_groups)会对variable_groups中的每个列表做笛卡尔积,每次迭代得到的item_group是一组(键,元素)元组,比如(('b',1), ('c','X'))。 - 字典合并:每次复制
fixed字典,再将当前笛卡尔积组转成的字典更新进去,得到完整的结果字典后加入最终列表。
边界情况适配
- 原字典无元组值:
variable_groups为空,itertools.product会返回含空元组的迭代器,合并后得到原字典,最终结果为[fixed]。 - 原字典全是元组值:
fixed为空,直接将每个笛卡尔积组转成字典即可。
内容的提问来源于stack exchange,提问作者Scott Zimmerman
相关产品推荐
相关产品推荐

