如何用Python3实现未知分类数的字典动态嵌套层级结构?
多层级列表数据重组解决方案
问题场景
给定原始数据结构tsv_data:
[ {'id':1,'name':'bob','type':'blue','size':2}, {'id':2,'name':'bob','type':'blue','size':3}, {'id':3,'name':'bob','type':'blue','size':4}, {'id':4,'name':'bob','type':'red','size':2}, {'id':5,'name':'sarah','type':'blue','size':2}, {'id':6,'name':'sarah','type':'blue','size':3}, {'id':7,'name':'sarah','type':'green','size':2}, {'id':8,'name':'jack','type':'blue','size':5}, ]
需要将其重组为动态多层级分层结构:
[ {'name':'bob', 'children':[ {'name':'blue','children':[ {'id':1, 'size':2}, {'id':2, 'size':3}, {'id':3, 'size':4} ]}, {'name':'red','children':[ {'id':4, 'size':2} ]} ]}, {'name':'sarah', 'children':[ {'name':'blue','children':[ {'id':5, 'size':2}, {'id':6, 'size':3}, ]}, {'name':'green','children':[ {'id':7, 'size':2} ]} ]}, {'name':'jack', 'children':[ {'name':'blue', 'children':[ {'id':8, 'size':5} ]} ]} ]
核心难点:无法预知name和type的具体取值及数量,需要一种通用的、动态适配的转换方法。
通用解决方案
采用字典映射+遍历构建的方式,完全根据数据动态生成层级结构,无需提前预设分类:
实现代码
def transform_data(tsv_data): # 映射已创建的name节点,快速定位避免重复创建 name_node_map = {} result_list = [] for item in tsv_data: current_name = item['name'] current_type = item['type'] # 提取叶子节点的核心数据 leaf_item = {'id': item['id'], 'size': item['size']} # 处理第一层级:name节点 if current_name not in name_node_map: new_name_node = {'name': current_name, 'children': []} name_node_map[current_name] = new_name_node result_list.append(new_name_node) target_name_node = name_node_map[current_name] # 处理第二层级:type节点 type_node_found = False for child_node in target_name_node['children']: if child_node['name'] == current_type: child_node['children'].append(leaf_item) type_node_found = True break if not type_node_found: new_type_node = {'name': current_type, 'children': [leaf_item]} target_name_node['children'].append(new_type_node) return result_list # 测试示例 tsv_data = [ {'id':1,'name':'bob','type':'blue','size':2}, {'id':2,'name':'bob','type':'blue','size':3}, {'id':3,'name':'bob','type':'blue','size':4}, {'id':4,'name':'bob','type':'red','size':2}, {'id':5,'name':'sarah','type':'blue','size':2}, {'id':6,'name':'sarah','type':'blue','size':3}, {'id':7,'name':'sarah','type':'green','size':2}, {'id':8,'name':'jack','type':'blue','size':5}, ] # 转换并打印格式化结果 import json transformed_result = transform_data(tsv_data) print(json.dumps(transformed_result, indent=2))
方法优势
- 动态适配:无论出现多少种
name或type的组合,都能自动生成对应层级,无需提前定义分类集合。 - 高效查找:用字典映射第一层级节点,避免重复遍历整个结果列表查找已存在的
name节点,提升处理效率。 - 易扩展:如果后续需要增加更多层级(比如新增
color字段作为第三层),只需在遍历逻辑中添加对应层级的查找/创建逻辑即可。
内容的提问来源于stack exchange,提问作者Arash Howaida
相关产品推荐
相关产品推荐

