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

如何将含重复ID的OrderedDict列表转换为嵌套结构?

如何将含重复ID的OrderedDict列表转换为嵌套结构?

你遇到的问题是需要把带有重复caseId和userId的OrderedDict列表,聚合嵌套成按caseId分组,每个caseId下再按userId分组、收集对应emailStatus的结构对吧?我来给你拆解迭代的核心思路,其实关键是用字典做“追踪容器”,利用字典键的唯一性来快速定位已存在的分组,避免重复创建。

原始输入数据

from collections import OrderedDict

original_list = [
    OrderedDict([('caseId', 20), ('userId', 1), ('emailStatus', 21)]),
    OrderedDict([('caseId', 20), ('userId', 1), ('emailStatus', 20)]),
    OrderedDict([('caseId', 18), ('userId', 4), ('emailStatus', 21)]),
    OrderedDict([('caseId', 19), ('userId', 3), ('emailStatus', 21)]),
    OrderedDict([('caseId', 18), ('userId', 1), ('emailStatus', 20)]),
    OrderedDict([('caseId', 20), ('userId', 3), ('emailStatus', 21)]),
    OrderedDict([('caseId', 18), ('userId', 4), ('emailStatus', 20)]),
    OrderedDict([('caseId', 19), ('userId', 1), ('emailStatus', 20)])
]

目标结构示例

[
    {
        "caseId": "20",
        "users": [
            {
                "userId": "1",
                "emailStatus": [
                    {"emailStatus": "20"},
                    {"emailStatus": "21"}
                ]
            },
            {
                "userId": "3",
                "emailStatus": [{"emailStatus": "21"}]
            }
        ]
    },
    {
        "caseId": "19",
        "users": [
            {
                "userId": "1",
                "emailStatus": [{"emailStatus": "20"}]
            },
            {
                "userId": "3",
                "emailStatus": [{"emailStatus": "21"}]
            }
        ]
    },
    {
        "caseId": "18",
        "users": [
            {
                "userId": "1",
                "emailStatus": [{"emailStatus": "20"}]
            },
            {
                "userId": "4",
                "emailStatus": [
                    {"emailStatus": "20"},
                    {"emailStatus": "21"}
                ]
            }
        ]
    }
]

迭代实现思路与代码

核心逻辑是用两个层级的字典来追踪已创建的分组:

  1. 外层字典case_tracker:键为caseId的值,值为对应case的完整结构(包含caseId和users列表)
  2. 每个case结构里的user_tracker:键为userId的值,值为对应用户的结构(包含userId和emailStatus列表)

这样遍历每条记录时,能快速定位到对应的case和user,避免重复遍历列表查找,效率更高。

from collections import OrderedDict

original_list = [
    OrderedDict([('caseId', 20), ('userId', 1), ('emailStatus', 21)]),
    OrderedDict([('caseId', 20), ('userId', 1), ('emailStatus', 20)]),
    OrderedDict([('caseId', 18), ('userId', 4), ('emailStatus', 21)]),
    OrderedDict([('caseId', 19), ('userId', 3), ('emailStatus', 21)]),
    OrderedDict([('caseId', 18), ('userId', 1), ('emailStatus', 20)]),
    OrderedDict([('caseId', 20), ('userId', 3), ('emailStatus', 21)]),
    OrderedDict([('caseId', 18), ('userId', 4), ('emailStatus', 20)]),
    OrderedDict([('caseId', 19), ('userId', 1), ('emailStatus', 20)])
]

# 外层追踪器:key是caseId,value是对应的case结构(含users列表和user追踪器)
case_tracker = {}

for item in original_list:
    case_id = str(item['caseId'])
    user_id = str(item['userId'])
    email_status = str(item['emailStatus'])
    
    # 步骤1:如果当前caseId不在追踪器里,创建新的case结构
    if case_id not in case_tracker:
        case_tracker[case_id] = {
            "caseId": case_id,
            "users": [],
            "user_tracker": {}  # 内层追踪器:key是userId,value是对应用户的结构
        }
    
    current_case = case_tracker[case_id]
    user_tracker = current_case["user_tracker"]
    
    # 步骤2:如果当前userId不在用户追踪器里,创建新的用户结构
    if user_id not in user_tracker:
        user_struct = {
            "userId": user_id,
            "emailStatus": []
        }
        user_tracker[user_id] = user_struct
        current_case["users"].append(user_struct)
    
    # 步骤3:把当前emailStatus添加到对应用户的列表里
    current_user = user_tracker[user_id]
    current_user["emailStatus"].append({"emailStatus": email_status})

# 最后把case_tracker里的value提取出来,就是我们要的嵌套列表
result = list(case_tracker.values())

# 可以打印结果看看(格式化输出更清晰)
import json
print(json.dumps(result, indent=2))

代码说明

  • 外层的case_tracker帮你快速判断当前caseId是否已经处理过,不用每次遍历结果列表找对应的case
  • 每个case里的user_tracker同理,帮你快速定位已存在的userId,避免重复创建用户结构
  • 最后只需要把追踪器里的case结构提取出来,就是目标的嵌套列表了

运行这段代码后,输出的结果就和你想要的结构完全一致啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:27:50