如何从嵌套字典生成所有配置组合?
递归生成嵌套字典的所有枚举配置
问题背景
给定一个包含嵌套结构的字典,其中部分值为列表类型,需要枚举所有列表元素的组合,生成所有可能的完整配置字典列表。示例输入如下:
input_dict = { "a": [1,2,3], "b":{ "b1":[True, False], "b2":[0], } }
期望输出所有组合后的配置列表:
config = [ { "a": 1, "b":{ "b1":True, "b2":0, } }, { "a": 1, "b":{ "b1":False, "b2":0, } }, { "a": 2, "b":{ "b1":True, "b2":0, } }, { "a": 2, "b":{ "b1":False, "b2":0, } }, { "a": 3, "b":{ "b1":True, "b2":0, } }, { "a": 3, "b":{ "b1":False, "b2":0, } } ]
递归实现方案
递归的核心思路是逐层拆解嵌套结构:
- 遇到普通值(非列表、非字典):直接包装为单元素列表,作为该字段的可选值
- 遇到列表:列表中的每个元素都是该字段的可选值
- 遇到嵌套字典:递归处理该子字典,得到子字典的所有可能配置,作为当前字段的可选值
最后通过笛卡尔积,将所有字段的可选值组合起来,生成完整的配置字典。
以下是Python代码实现:
import itertools def generate_configs(data): # 存储每个键对应的可选值列表 key_options = [] for key, value in data.items(): if isinstance(value, list): # 列表类型:每个元素都是一个选项 options = [(key, v) for v in value] elif isinstance(value, dict): # 嵌套字典:递归获取子配置,每个子配置作为一个选项 sub_configs = generate_configs(value) options = [(key, sub_cfg) for sub_cfg in sub_configs] else: # 普通值:只有一个选项 options = [(key, value)] key_options.append(options) # 生成所有键选项的笛卡尔积,组合成完整配置 configs = [] for combination in itertools.product(*key_options): config = {} for key, val in combination: config[key] = val configs.append(config) return configs # 测试示例 input_dict = { "a": [1,2,3], "b":{ "b1":[True, False], "b2":[0], } } config = generate_configs(input_dict) # 打印结果 for cfg in config: print(cfg)
代码说明
- 递归处理嵌套字典:当遇到子字典时,调用
generate_configs递归生成该子字典的所有可能配置,每个子配置作为当前键的一个可选值。 - 笛卡尔积组合:使用
itertools.product将所有键的可选值进行全组合,确保覆盖所有可能的枚举情况。 - 兼容多种类型:自动处理普通值、列表、嵌套字典三种情况,适配不同的输入结构。
内容的提问来源于stack exchange,提问作者qiao
相关产品推荐
相关产品推荐

