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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:00:54