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

如何用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))

方法优势

  1. 动态适配:无论出现多少种name或type的组合,都能自动生成对应层级,无需提前定义分类集合。
  2. 高效查找:用字典映射第一层级节点,避免重复遍历整个结果列表查找已存在的name节点,提升处理效率。
  3. 易扩展:如果后续需要增加更多层级(比如新增color字段作为第三层),只需在遍历逻辑中添加对应层级的查找/创建逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:15:39