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

Python中嵌套字典列表转层级结构的稳健实现求助

将嵌套字典列表转换为层级结构的稳健实现方法

我来帮你搞定这个层级结构转换的问题!你的需求是把嵌套字典列表转成任意深度的层级结构,现有实现确实只能处理到两层,遇到更深的嵌套就会失效。下面我给你两种稳健的实现方案,一种是高效的节点映射方式,另一种是你考虑的递归方式。

先明确你的输入与期望输出

输入结构

nested_list = [
 { "id" : "fruit", "name" : "apple" },
 { "name": "fruit" },
 { "id" : "fruit", "name" : "grape" },
 { "id" : "fruit", "name" : "pineapple" },
 { "name": "vehicle" },
 { "id" : "vehicle", "name": "car" },
 { "id" : "car", "name": "sedan" },
]

期望输出结构

{
 "vehicle": { "car": { "sedan" : {} } },
 "fruit" : { "apple": {}, "grape": {}, "pineapple": {} }
}

现有实现的问题

你当前的代码只能处理最多两层的嵌套,当新增类似{ "id" : "sedan", "name": "mini sedan" }的三层条目时,就无法深入到第三层找到父节点,灵活性和稳健性都不足。


方案一:节点映射法(高效且稳健)

这个方法通过维护一个节点引用字典,直接通过父ID找到对应的节点,无需遍历整个结构,支持任意深度的嵌套,效率更高。

def build_hierarchy(nested_list):
    root = {}
    node_map = {}  # 存储所有节点的引用:key为节点的id/name,value为对应的字典节点
    
    # 第一步:先处理所有顶层节点(没有id的条目)
    for item in nested_list:
        if 'id' not in item:
            name = item['name']
            root[name] = {}
            node_map[name] = root[name]
    
    # 第二步:处理有父id的条目,直接通过映射找到父节点并添加子节点
    for item in nested_list:
        if 'id' in item:
            parent_id = item['id']
            child_name = item['name']
            
            # 如果父节点已存在于映射中,直接添加子节点
            if parent_id in node_map:
                node_map[parent_id][child_name] = {}
                node_map[child_name] = node_map[parent_id][child_name]
    
    return root

测试验证

# 测试原输入
result = build_hierarchy(nested_list)
print(result)  # 输出与期望完全一致

# 测试三层嵌套的情况
nested_list.append({"id": "sedan", "name": "mini sedan"})
result = build_hierarchy(nested_list)
print(result)
# 输出:
# {
#  "vehicle": {"car": {"sedan": {"mini sedan": {}}}},
#  "fruit": {"apple": {}, "grape": {}, "pineapple": {}}
# }

这个方案的优势:

  • 支持任意深度的嵌套扩展
  • 查找父节点的时间复杂度是O(1),效率远高于遍历查找
  • 逻辑清晰,容错性强(如果父ID不存在则跳过,不会报错)

方案二:递归查找法(符合你最初的思路)

如果你更倾向于用递归实现,可以写一个辅助函数递归查找父节点,再添加子节点:

def find_parent_node(root, parent_id):
    # 递归遍历查找目标父节点
    for key, value in root.items():
        if key == parent_id:
            return value
        # 递归进入子节点继续查找
        found_node = find_parent_node(value, parent_id)
        if found_node is not None:
            return found_node
    return None

def build_hierarchy_recursive(nested_list):
    root = {}
    
    # 先处理所有顶层节点
    for item in nested_list:
        if 'id' not in item:
            root[item['name']] = {}
    
    # 处理子节点,通过递归找到父节点
    for item in nested_list:
        if 'id' in item:
            parent_id = item['id']
            child_name = item['name']
            parent_node = find_parent_node(root, parent_id)
            if parent_node is not None:
                parent_node[child_name] = {}
    
    return root

这个递归方案也能实现需求,但当列表规模大、层级深时,递归查找的效率会比节点映射法低一些,适合小规模数据场景。

内容的提问来源于stack exchange,提问作者Yehui He

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 06:57:39