如何基于配置深度动态生成嵌套for循环与目标字典?
动态生成对应深度的嵌套字典扁平化实现方法
方案1:递归遍历(推荐)
不用动态生成推导式代码,直接通过递归遍历所有嵌套层级,自动收集键路径与对应值,适配任意嵌套深度,无需提前指定循环变量。
代码示例:
def flatten_nested_dict(nested_dict, prefix=()): result = {} if isinstance(nested_dict, dict): for key, value in nested_dict.items(): result.update(flatten_nested_dict(value, prefix + (key,))) else: result[prefix] = nested_dict return result # 使用示例 config = { "content": { "a": {"x": 1, "y": 2}, "b": {"z": 3} } } flattened = flatten_nested_dict(config["content"]) print(flattened) # 输出:{('a', 'x'): 1, ('a', 'y'): 2, ('b', 'z'): 3}
方案2:动态生成字典推导式(慎用)
如果必须通过动态生成推导式的方式实现,可以通过字符串拼接生成代码,再用exec执行。注意:此方法存在代码注入风险,仅在输入完全可信的场景下使用。
代码示例:
def generate_flatten_dict(config, loop_vars): # 构建键路径元组字符串 key_tuple = "(" + ",".join(loop_vars) + ")" # 构建取值表达式 access_expr = "config['content']" for var in loop_vars: access_expr += f"[{var}]" # 构建循环语句部分 loops = [] current_level = "config['content']" for var in loop_vars: loops.append(f"for {var} in {current_level}.keys()") current_level += f"[{var}]" # 拼接完整推导式 dict_comp_str = f"{{{key_tuple}: {access_expr} {' '.join(loops)}}}" # 执行并返回结果 local_vars = {"config": config} exec(f"result = {dict_comp_str}", globals(), local_vars) return local_vars["result"] # 使用示例 config = { "content": { "a": {"x": 1, "y": 2}, "b": {"z": 3} } } # 指定循环变量列表,长度对应嵌套深度 flattened = generate_flatten_dict(config, ["i", "j", "k"]) print(flattened) # 输出:{('a', 'x'): 1, ('a', 'y'): 2, ('b', 'z'): 3}
内容的提问来源于stack exchange,提问作者Fizi
相关产品推荐
相关产品推荐

