如何用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
相关产品推荐
相关产品推荐

