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

如何根据父子ID对应关系递归创建指定嵌套字典

问题说明

现有一组存储父ID与子ID对应关系的映射数据,需要基于该数据递归构建嵌套字典。

  • 输入数据:
child_dict = {11: [12, 13], 12:[], 13:[14], 14:[], 15:[]}
  • 期望输出:
output = {11: [12, {13:14}], 15:[]}

要求使用递归方式实现转换逻辑。

递归实现方案

核心思路分两步:先筛选出所有顶层根节点(即不会作为任何节点子节点存在的ID,是最终输出字典的顶层键),再通过深度优先搜索递归处理每个节点的子节点,按规则组装嵌套结构。

完整代码

def build_nested_dict(child_dict):
    # 收集所有出现过的子节点,筛选顶层根节点
    all_children = set()
    for kids in child_dict.values():
        all_children.update(kids)
    roots = [node_id for node_id in child_dict if node_id not in all_children]

    def dfs(current_node):
        children = child_dict[current_node]
        processed_kids = []
        for kid in children:
            # 子节点无后代,直接保留ID
            if not child_dict[kid]:
                processed_kids.append(kid)
            # 子节点有后代,递归构建嵌套字典
            else:
                sub_struct = dfs(kid)
                processed_kids.append({kid: sub_struct})
        # 单元素列表直接返回值,空列表/多元素列表直接返回
        return processed_kids[0] if len(processed_kids) == 1 else processed_kids

    # 组装顶层结果
    result = {}
    for root in roots:
        result[root] = dfs(root)
    return result

效果验证

运行代码测试输入:

child_dict = {11: [12, 13], 12:[], 13:[14], 14:[], 15:[]}
print(build_nested_dict(child_dict))

得到输出与期望完全一致:

{11: [12, {13: 14}], 15: []}

逻辑说明

  • 根节点筛选逻辑:遍历所有父节点的子列表,没有出现在子列表中的节点就是没有父节点的顶层根节点
  • 递归处理规则:
    • 遍历当前节点的所有直接子节点,如果子节点没有自己的后代,直接将子节点ID加入结果列表
    • 如果子节点存在后代,递归计算子节点的嵌套结构,组装为{子节点ID: 递归结果}的字典加入结果列表
    • 处理完当前节点所有子节点后,如果结果列表只有1个元素,直接返回该元素(匹配样例中13对应值为14而非[14]的要求);空列表、多元素列表直接返回即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:57:25