You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含列表值的字典转换为全排列字典列表,兼容非列表值?

实现方案

核心思路

  • 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:06:01