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

如何用Python实现基于缩进的10层嵌套字典?解决层级报错

多层缩进配置文件转嵌套字典的优雅实现方案

核心思路

用栈结构跟踪当前层级的父字典,每一行先计算对应层级,再调整栈的长度匹配层级,最后把当前键值对加入对应父字典。这种方式天然支持任意深度的嵌套,10层完全不在话下。

可运行代码实现

def parse_indented_config(config_lines):
    # 栈元素格式:(当前层级, 对应字典),初始层级设为-1,确保0级能正常添加
    stack = [(-1, {})]
    root = stack[0][1]

    for line in config_lines:
        line = line.rstrip('\n')
        # 跳过空行和注释
        if not line or line.lstrip().startswith('#'):
            continue

        # 计算当前行的层级:前导空格数除以2,对应0-10级
        leading_spaces = len(line) - len(line.lstrip(' '))
        current_level = leading_spaces // 2

        # 拆分键值对,兼容冒号后带空格的格式
        key_part, value_part = line.split(':', 1)
        key = key_part.strip()
        raw_value = value_part.strip()

        # 自动转换值类型,避免把True/False当成字符串键导致KeyError
        try:
            if raw_value.lower() == 'true':
                value = True
            elif raw_value.lower() == 'false':
                value = False
            elif raw_value.isdigit():
                value = int(raw_value)
            elif '.' in raw_value and raw_value.replace('.', '', 1).isdigit():
                value = float(raw_value)
            else:
                value = raw_value
        except:
            value = raw_value

        # 调整栈:弹出比当前层级高或相等的元素,找到父字典
        while stack[-1][0] >= current_level:
            stack.pop()
        parent_dict = stack[-1][1]

        # 创建当前项的字典(后续子项会加入这里)
        current_item = {}
        parent_dict[key] = current_item

        # 将当前层级和字典压入栈,供后续子项使用
        stack.append((current_level, current_item))

    return root

关键细节说明

  • 层级计算:通过leading_spaces // 2精准对应题目要求的层级规则(0空格→0级,2空格→1级…20空格→10级)
  • 栈的作用:始终维护从根到当前父级的路径,遇到更深层级时保留父字典引用,层级回退时自动弹出无关项
  • 值类型转换:专门处理了布尔值和数字,彻底解决原代码中把'True'字符串当成键访问的KeyError问题
  • 兼容性:只要缩进严格遵循2空格递增,不管多少层嵌套都能正确解析,10层完全覆盖需求

测试示例

假设配置文件内容如下:

app:
  name: my-service
  debug: False
  database:
    host: 127.0.0.1
    port: 3306
    auth:
      username: dev
      password: dev-pass
      settings:
        auto_reconnect: True
        pool_size: 20

调用parse_indented_config(open('your_config.txt').readlines())会生成如下嵌套字典:

{
    'app': {
        'name': 'my-service',
        'debug': False,
        'database': {
            'host': '127.0.0.1',
            'port': 3306,
            'auth': {
                'username': 'dev',
                'password': 'dev-pass',
                'settings': {
                    'auto_reconnect': True,
                    'pool_size': 20
                }
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Victor Sanz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:27:34