如何将含列表值的字典转换为全排列字典列表,兼容非列表值?
实现方案
核心思路
- 用
itertools.product生成列表值的所有笛卡尔积组合 - 预处理输入字典:将非列表类型的值统一包装为单元素列表,保证生成组合时固定值不变
- 遍历笛卡尔积结果,与原字典的键映射生成最终的字典列表
完整代码实现
import itertools def dict_to_list_of_dicts(input_dict): # 预处理:所有值转成列表,非列表值包装为单元素列表 processed = {k: v if isinstance(v, list) else [v] for k, v in input_dict.items()} # 提取键列表,保证顺序对应 keys = list(processed.keys()) # 生成所有值的笛卡尔积 value_combinations = itertools.product(*processed.values()) # 每个组合拼成字典,收集为列表 return [dict(zip(keys, combo)) for combo in value_combinations]
测试验证
测试1:全列表值的基础场景
DL = {'a': [0, 1], 'b': [2, 3]} LD = dict_to_list_of_dicts(DL) print(LD) # 输出:[{'a': 0, 'b': 2}, {'a': 0, 'b': 3}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}]
测试2:包含非列表固定值的场景
D = {'a': [0, 1], 'b': [2, 3], 'c':7, 'd':9} L = dict_to_list_of_dicts(D) print(L) # 输出:[{'a': 0, 'b': 2, 'c':7, 'd':9}, {'a': 0, 'b': 3, 'c':7, 'd':9}, {'a': 1, 'b': 2, 'c':7, 'd':9}, {'a': 1, 'b': 3, 'c':7, 'd':9}]
简洁写法(无需封装函数)
如果不需要复用逻辑,直接用一行列表推导式即可实现:
import itertools DL = {'a': [0, 1], 'b': [2, 3]} LD = [dict(zip(DL.keys(), combo)) for combo in itertools.product(*[v if isinstance(v, list) else [v] for v in DL.values()])]
内容的提问来源于stack exchange,提问作者Zepphit
相关产品推荐
相关产品推荐

