如何生成嵌套JSON预处理配置的所有参数迭代组合?
预处理参数组合生成问题修复
配置与需求
预处理配置文件示例:
"Preprocessing": {"BOW":{"ngram_range":[1,2], "max_features":[100, 200]},"RemoveStopWords": {"Parameter1": ["..."]}}
需求:基于该配置生成所有参数迭代组合,且保留BOW、RemoveStopWords的层级结构,传入Preprocessing对象。
期望输出
[ {"BOW":{"ngram_range":1, "max_features":100}, "RemoveStopWords":{"Parameter1": "..."}}, {"BOW":{"ngram_range":2, "max_features":100}, "RemoveStopWords":{"Parameter1": "..."}}, {"BOW":{"ngram_range":1, "max_features":200}, "RemoveStopWords":{"Parameter1": "..."}}, {"BOW":{"ngram_range":2, "max_features":200}, "RemoveStopWords":{"Parameter1": "..."}} ]
当前错误输出
[ {"ngram_range":1, "max_features":100, "Parameter1":"..."}, {"ngram_range":2, "max_features":200, "Parameter1":"..."}, {"ngram_range":1, "max_features":100, "Parameter1":"..."}, {"ngram_range":2, "max_features":200, "Parameter1":"..."} ]
修正后的Python代码
import itertools import json # 原始预处理配置 preprocessing_config = { "BOW": {"ngram_range": [1, 2], "max_features": [100, 200]}, "RemoveStopWords": {"Parameter1": ["..."]} } def generate_param_combinations(config): # 为每个预处理步骤生成参数的所有可能组合 step_candidates = [] for step_name, params in config.items(): param_keys = list(params.keys()) param_values = list(params.values()) # 生成当前步骤的所有参数组合(字典形式) step_param_combos = [dict(zip(param_keys, vals)) for vals in itertools.product(*param_values)] # 包装为(步骤名, 参数组合)的元组列表,方便后续组装 step_candidates.append([(step_name, combo) for combo in step_param_combos]) # 生成跨步骤的笛卡尔积组合 all_combos = itertools.product(*step_candidates) # 组装成最终的嵌套结构 result = [] for combo in all_combos: preprocessing_dict = {} for step_name, params in combo: preprocessing_dict[step_name] = params result.append(preprocessing_dict) return result # 生成并输出结果 final_result = generate_param_combinations(preprocessing_config) print(json.dumps(final_result, indent=2))
关键修复点
- 保留了
BOW和RemoveStopWords的层级结构,未将参数平铺开 - 先为每个预处理步骤单独生成参数组合,再通过笛卡尔积得到跨步骤的所有组合
- 最终组装时将每个步骤的参数组合对应到原步骤名称下,完全匹配预期的嵌套格式
内容的提问来源于stack exchange,提问作者Daniel Kennett
相关产品推荐
相关产品推荐

