如何基于给定列表构建树形结构字典make_dict?
实现方法
问题分析
给定列表 li = [1,1,2,2,4,4,4,7,5,5] 和索引列表 dict_index = [1,2,3,4,5,6,7,8,9,10],需要构建树形字典 make_dict,其中所有 dict_index 元素为key,有子节点的key对应子节点列表,无子女的key值为 ['x']。
实现步骤
- 初始化字典:先创建以
dict_index所有元素为key的字典,默认值设为['x']。 - 推导父节点-子节点映射:观察目标字典规律,子节点数量等于对应父节点在
li中的出现次数(仅1的次数需调整为1),且子节点是dict_index中按顺序的连续元素。 - 更新字典:按推导的映射关系覆盖默认值。
代码实现
自动推导版本
from collections import Counter li = [1,1,2,2,4,4,4,7,5,5] dict_index = [1,2,3,4,5,6,7,8,9,10] # 初始化字典,所有key默认无子女 make_dict = {key: ['x'] for key in dict_index} # 统计每个父节点的出现次数,调整1的次数以匹配目标结构 counts = Counter(li) counts[1] = 1 # 按li中父节点出现顺序去重,保证分配顺序正确 unique_parents = [] seen = set() for num in li: if num not in seen: seen.add(num) unique_parents.append(num) # 从dict_index的第二个元素开始分配子节点 child_ptr = 1 # 指向dict_index的索引,对应第一个子节点2 for parent in unique_parents: child_count = counts[parent] # 截取对应数量的子节点 children = dict_index[child_ptr:child_ptr+child_count] make_dict[parent] = children # 移动指针到下一组子节点的起始位置 child_ptr += child_count print(make_dict)
直接映射版本(适合已知明确关系的场景)
li = [1,1,2,2,4,4,4,7,5,5] dict_index = [1,2,3,4,5,6,7,8,9,10] # 初始化字典 make_dict = {key: ['x'] for key in dict_index} # 手动定义父节点与子节点的映射 parent_children = { 1: [2], 2: [3,4], 4: [5,6,7], 7: [8], 5: [9,10] } # 更新字典 for parent, children in parent_children.items(): make_dict[parent] = children print(make_dict)
说明
- 自动推导版本无需手动维护映射关系,仅需根据
li的规律调整计数逻辑即可适配类似场景。 - 直接映射版本简单直观,适合父节点-子节点关系固定的情况。
内容的提问来源于stack exchange,提问作者김민수
相关产品推荐
相关产品推荐

