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

如何用Python将三表联查结果按层级分组为嵌套字典?

实现扁平数据到嵌套结构的简便方法

有两种简便的方法可以完成这个层级分组转换,具体实现如下:

方法一:基于字典的遍历分组

这种方法通过字典快速定位已创建的订单和条目,遍历每条数据时逐步构建嵌套结构,逻辑直观,无需提前排序:

data = [
    {"service_order_number": "ABC", "item_id": 0, "ticket_id": 10},
    {"service_order_number": "ABC", "item_id": 0, "ticket_id": 11},
    {"service_order_number": "ABC", "item_id": 1, "ticket_id": 12},
    {"service_order_number": "DEF", "item_id": 3, "ticket_id": 13},
    {"service_order_number": "DEF", "item_id": 3, "ticket_id": 14},
    {"service_order_number": "DEF", "item_id": 3, "ticket_id": 15}]

result = []
order_map = {}  # 用字典快速查找已存在的订单

for entry in data:
    order_num = entry["service_order_number"]
    item_id = entry["item_id"]
    ticket_id = entry["ticket_id"]
    
    # 处理订单层级
    if order_num not in order_map:
        order_obj = {"service_order_number": order_num, "line_items": []}
        order_map[order_num] = order_obj
        result.append(order_obj)
    order_obj = order_map[order_num]
    
    # 处理条目层级:临时构建item_id到item对象的映射
    item_map = {item["item_id"]: item for item in order_obj["line_items"]}
    if item_id not in item_map:
        item_obj = {"item_id": item_id, "tickets": []}
        order_obj["line_items"].append(item_obj)
        item_map[item_id] = item_obj
    item_obj = item_map[item_id]
    
    # 添加当前工单
    item_obj["tickets"].append({"ticket_id": ticket_id})

print(result)

方法二:使用itertools.groupby分组

利用Python标准库的itertools.groupby可以快速按指定键分组,不过需要先对数据按分组键排序(确保同组数据连续):

from itertools import groupby

data = [
    {"service_order_number": "ABC", "item_id": 0, "ticket_id": 10},
    {"service_order_number": "ABC", "item_id": 0, "ticket_id": 11},
    {"service_order_number": "ABC", "item_id": 1, "ticket_id": 12},
    {"service_order_number": "DEF", "item_id": 3, "ticket_id": 13},
    {"service_order_number": "DEF", "item_id": 3, "ticket_id": 14},
    {"service_order_number": "DEF", "item_id": 3, "ticket_id": 15}]

# 先按service_order_number和item_id排序,保证groupby能正确分组
sorted_data = sorted(data, key=lambda x: (x["service_order_number"], x["item_id"]))

result = []
# 第一层按订单号分组
for order_num, order_group in groupby(sorted_data, key=lambda x: x["service_order_number"]):
    line_items = []
    # 第二层按条目ID分组
    for item_id, item_group in groupby(order_group, key=lambda x: x["item_id"]):
        # 收集当前条目下的所有工单
        tickets = [{"ticket_id": entry["ticket_id"]} for entry in item_group]
        line_items.append({"item_id": item_id, "tickets": tickets})
    result.append({"service_order_number": order_num, "line_items": line_items})

print(result)

方法对比

  • 方法一:无需排序,遍历一次即可完成,适合数据量较大或原始数据无序的场景,查找效率高。
  • 方法二:代码更简洁,依赖标准库,但需要先排序,适合数据本身已按分组键有序,或排序成本较低的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:42:51