如何将带斜杠路径的字典转换为嵌套字典?代码未生效
斜杠分隔键转嵌套字典的修复方案
问题原因分析
你原代码的核心问题在于使用current_dict.get(new_key, {})处理层级键:当目标键不存在时,get方法会返回一个新的空字典,但这个临时字典并没有被添加到上层字典中。后续的赋值操作都只在这个临时字典里进行,不会影响最终的result_dict,因此只有最顶层直接赋值的BUILDING_C和BUILDING_D被保留下来。
修正后的代码
使用dict.setdefault()方法替代get(),该方法会在键不存在时自动将键和默认值添加到当前字典,同时返回这个值,确保后续操作能正确关联到嵌套的层级:
start_dict = { "/BUILDING_A/FLOOR_3/ROOM_12": 3, "/BUILDING_A/FLOOR_3/ROOM_15": 4, "/BUILDING_A/FLOOR_4/ROOM_3": 2, "/BUILDING_B/FLOOR_1": 5, "/BUILDING_B/FLOOR_2": 3, "/BUILDING_C": 25, "/BUILDING_D": 32, } result_dict = {} for key, value in start_dict.items(): # 处理键:去除开头斜杠并按斜杠分割成层级列表 new_keys = key.lstrip("/").split("/") current_dict = result_dict # 遍历除最后一个键外的所有层级,创建嵌套结构 for new_key in new_keys[:-1]: current_dict = current_dict.setdefault(new_key, {}) # 给最后一层键赋值 current_dict[new_keys[-1]] = value # 格式化打印结果验证 import json print(json.dumps(result_dict, indent=4))
代码说明
- 键处理:
key.lstrip("/").split("/")把带斜杠的路径键转换成层级列表,例如"/BUILDING_A/FLOOR_3/ROOM_12"会被处理为["BUILDING_A", "FLOOR_3", "ROOM_12"]。 - 层级构建:
setdefault(new_key, {})确保每一层级的键都存在,不存在则自动创建空字典并关联到上层,这样current_dict始终指向当前需要操作的嵌套字典层级。 - 最终赋值:遍历完层级后,给最后一个键设置对应的值,完成整个路径的嵌套赋值。
运行代码后会得到你预期的嵌套字典结构。
内容的提问来源于stack exchange,提问作者Xukrao
相关产品推荐
相关产品推荐

