如何将含重复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"} ] } ] } ]
迭代实现思路与代码
核心逻辑是用两个层级的字典来追踪已创建的分组:
- 外层字典
case_tracker:键为caseId的值,值为对应case的完整结构(包含caseId和users列表) - 每个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
相关产品推荐
相关产品推荐

