如何根据父子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
相关产品推荐
相关产品推荐

