如何保留字典键的同时生成各键对应列表值的笛卡尔积?
生成字典值列表的笛卡尔积并保留原键
可以用Python标准库中的itertools.product来实现这个需求,不管字典有多少个键都能适用,具体步骤如下:
实现代码
import itertools dicts = { "d1": ["d1_value", "d1_value2"], "d2": ["d2_value", "d2_value2"] } # 提取字典的键和对应的值列表 keys = list(dicts.keys()) value_lists = list(dicts.values()) # 生成所有值的笛卡尔积 product_results = itertools.product(*value_lists) # 将每个笛卡尔积元组转换为带原键的字典 result = [dict(zip(keys, item)) for item in product_results]
运行结果
[ {"d1": "d1_value", "d2": "d2_value"}, {"d1": "d1_value", "d2": "d2_value2"}, {"d1": "d1_value2", "d2": "d2_value"}, {"d1": "d1_value2", "d2": "d2_value2"} ]
原理说明
- 先提取字典的键和值列表,确保键与对应值列表的顺序完全匹配;
itertools.product(*value_lists)会将所有值列表的元素进行笛卡尔积组合,返回一个包含所有组合元组的迭代器;- 用
zip(keys, item)把每个元组的元素和对应的键一一配对,再通过dict()转换成字典,最后用列表推导式生成最终结果列表。
多键场景验证
如果字典包含更多键,比如3个键的情况:
dicts = { "a": [1, 2], "b": ["x", "y"], "c": [True, False] }
运行代码后会生成8个字典,每个都是三个键值对的完整组合,完全满足需求。
内容的提问来源于stack exchange,提问作者Lupzoh
相关产品推荐
相关产品推荐

