如何将OrderedDict列表转换为指定嵌套结构?求解决方案
问题:将扁平OrderedDict列表转换为嵌套结构
我有一组扁平的OrderedDict数据:
from collections import OrderedDict data = [ OrderedDict([('caseId', 20), ('userId', 1), ('userName', 'user1'), ('emailStatus', 21), ('emailBody' , 'body')]), OrderedDict([('caseId', 20), ('userId', 1), ('userName', 'user1'), ('emailStatus', 20), ('emailBody' , 'body')]), OrderedDict([('caseId', 18), ('userId', 4), ('userName', 'user4'), ('emailStatus', 21), ('emailBody' , 'body')]), OrderedDict([('caseId', 19), ('userId', 3), ('userName', 'user3'), ('emailStatus', 21), ('emailBody' , 'body')]), OrderedDict([('caseId', 18), ('userId', 1), ('userName', 'user1'), ('emailStatus', 20), ('emailBody' , 'body')]), OrderedDict([('caseId', 20), ('userId', 3), ('userName', 'user3'), ('emailStatus', 21), ('emailBody' , 'body')]), OrderedDict([('caseId', 18), ('userId', 4), ('userName', 'user4'), ('emailStatus', 20), ('emailBody' , 'body')]), OrderedDict([('caseId', 19), ('userId', 1), ('userName', 'user1'), ('emailStatus', 20), ('emailBody' , 'body')]) ]
我希望把它转换成如下的嵌套结构:
[ { "caseId": "20", "users": [ { "userId": "1", "userName": "user1", "emailStatus": [ {"emailStatus": "20", "emailBody": "body"}, {"emailStatus": "21", "emailBody": "body"} ] }, { "userId": "3", "userName": "user3", "emailStatus": [{"emailStatus": "21", "emailBody": "body"}] } ] }, { "caseId": "19", "users": [ { "userId": "1", "userName": "user1", "emailStatus": [{"emailStatus": "20", "emailBody": "body"}] }, { "userId": "3", "userName": "user3", "emailStatus": [{"emailStatus": "21", "emailBody": "body"}] } ] }, { "caseId": "18", "users": [ { "userId": "1", "userName": "user1", "emailStatus": [{"emailStatus": "20", "emailBody": "body"}] }, { "userId": "4", "userName": "user4", "emailStatus": [ {"emailStatus": "20", "emailBody": "body"}, {"emailStatus": "21", "emailBody": "body"} ] } ] } ]
我尝试用temp.setdefault(d["caseId"], {}).setdefault(str(d["userId"])+str(d["userName"]),[])来处理,但这个方法会把userId和userName拼接成字符串当键,没法生成预期的嵌套对象结构,求解决思路。
解决思路与代码实现
你的核心需求是按caseId分组,每个case下按userId分组,每个用户下收集对应的email状态和内容。之前的方法用拼接字符串当键的问题在于,没法保留userId和userName的独立字段,也没法构建嵌套的对象结构。我们可以分三层来处理:
步骤1:用字典做中间缓存,按caseId和userId分组
我们可以创建一个中间字典,键是caseId,对应的值是另一个字典,键是userId,对应的值是用户的基础信息(userId、userName)以及该用户的email列表。这样就能逐层聚合数据。
步骤2:遍历原始数据,填充中间缓存
遍历每一条OrderedDict数据,依次:
- 找到当前caseId对应的分组(不存在则创建)
- 找到当前userId对应的用户对象(不存在则初始化,包含userId、userName和空的emailStatus列表)
- 将当前的emailStatus和emailBody作为字典添加到该用户的emailStatus列表中
步骤3:将中间缓存转换为目标列表结构
把中间字典的键值对转换成目标的列表格式,注意把数值类型转为字符串(和你的预期结构一致)。
完整代码示例
from collections import OrderedDict import json data = [ OrderedDict([('caseId', 20), ('userId', 1), ('userName', 'user1'), ('emailStatus', 21), ('emailBody' , 'body')]), OrderedDict([('caseId', 20), ('userId', 1), ('userName', 'user1'), ('emailStatus', 20), ('emailBody' , 'body')]), OrderedDict([('caseId', 18), ('userId', 4), ('userName', 'user4'), ('emailStatus', 21), ('emailBody' , 'body')]), OrderedDict([('caseId', 19), ('userId', 3), ('userName', 'user3'), ('emailStatus', 21), ('emailBody' , 'body')]), OrderedDict([('caseId', 18), ('userId', 1), ('userName', 'user1'), ('emailStatus', 20), ('emailBody' , 'body')]), OrderedDict([('caseId', 20), ('userId', 3), ('userName', 'user3'), ('emailStatus', 21), ('emailBody' , 'body')]), OrderedDict([('caseId', 18), ('userId', 4), ('userName', 'user4'), ('emailStatus', 20), ('emailBody' , 'body')]), OrderedDict([('caseId', 19), ('userId', 1), ('userName', 'user1'), ('emailStatus', 20), ('emailBody' , 'body')]) ] # 中间缓存字典 case_cache = {} for item in data: case_id = item['caseId'] user_id = item['userId'] user_name = item['userName'] email_status = item['emailStatus'] email_body = item['emailBody'] # 初始化case分组 if case_id not in case_cache: case_cache[case_id] = {} # 初始化用户对象 if user_id not in case_cache[case_id]: case_cache[case_id][user_id] = { 'userId': str(user_id), 'userName': user_name, 'emailStatus': [] } # 添加email记录 case_cache[case_id][user_id]['emailStatus'].append({ 'emailStatus': str(email_status), 'emailBody': email_body }) # 转换为目标列表结构 result = [] for case_id, users_dict in case_cache.items(): case_obj = { 'caseId': str(case_id), 'users': list(users_dict.values()) } result.append(case_obj) # 格式化输出结果 print(json.dumps(result, indent=2))
这段代码运行后会输出你预期的嵌套结构。核心是用两层字典做缓存,分别按caseId和userId聚合数据,最后再转换为列表格式,完美解决了你之前拼接字符串导致的结构问题。
内容的提问来源于stack exchange,提问作者Naila Akbar
相关产品推荐
相关产品推荐

