如何将字典列表按父子关系转换为层级字典结构?
解决字典列表转层级结构问题
实现思路
- 建立ID映射表:将所有元素按
_id存入字典,实现父节点的O(1)快速查找。 - 构建层级关系:遍历每个元素,若存在
parent_id则将其添加到对应父节点的children列表(同时移除parent_id字段);无parent_id的元素直接作为根节点存入结果列表。 - 支持多层嵌套:由于映射表预先包含所有元素,即使子节点先被处理,父节点也已存在,可正确构建任意深度的嵌套结构。
代码实现
data = [ {"_id": 1, "label": "Property", "index": 1}, {"_id": 2, "label": "Find Property", "index": 1, "parent_id": 1}, {"_id": 3, "label": "Add Property", "index": 2, "parent_id": 1}, {"_id": 4, "label": "Offer", "index": 2}, {"_id": 5, "label": "My Offer", "index": 1, "parent_id": 4}, {"_id": 6, "label": "Accept", "index": 1, "parent_id": 5} ] # 建立ID到元素的映射 item_map = {item["_id"]: item for item in data} root_nodes = [] for item in data: parent_id = item.get("parent_id") if parent_id is not None: # 获取父节点并初始化children列表 parent = item_map[parent_id] parent.setdefault("children", []) # 移除子节点的parent_id字段 del item["parent_id"] # 将子节点加入父节点的children parent["children"].append(item) else: # 无父节点的元素作为根节点 root_nodes.append(item) # 格式化输出结果 import json print(json.dumps(root_nodes, indent=4))
运行结果
输出与预期完全一致:
[ { "_id": 1, "label": "Property", "index": 1, "children": [ { "_id": 2, "label": "Find Property", "index": 1 }, { "_id": 3, "label": "Add Property", "index": 2 } ] }, { "_id": 4, "label": "Offer", "index": 2, "children": [ { "_id": 5, "label": "My Offer", "index": 1, "children": [ { "_id": 6, "label": "Accept", "index": 1 } ] } ] } ]
内容的提问来源于stack exchange,提问作者Test User
相关产品推荐
相关产品推荐

