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

如何按subject_id分组字典列表生成嵌套数据?代码问题排查

问题:按subject_id整合字典列表数据

我拥有名为all_writing_test_name_data的字典列表,期望将其中subject_id相同的条目整合到嵌套的writing_items数组中,形成指定结构的数据。但尝试的代码无法得到目标结果,请问代码存在什么问题,如何实现需求?

原始数据

all_writing_test_name_data = [
    {
        "id": 1,
        "book_name": "Math",
        "writing_test_description": "string",
        "subject_id": 1,
        "book_id": 2,
        "writing_test": "string"
    },
    {
        "id": 2,
        "book_name": "Math-1",
        "writing_test_description": "string-1",
        "subject_id": 1,
        "book_id": 2,
        "writing_test": "string-1"
    }
]

期望结果

[
    {
        "subject_id": 1,
        "writing_items": [
            {
                "id": 1,
                "book_name": "Math",
                "writing_test_description": "string",
                "book_id": 2,
                "writing_test": "string"
            },
            {
                "id": 2,
                "book_name": "Math-1",
                "writing_test_description": "string-1",
                "book_id": 2,
                "writing_test": "string-1"
            }
        ]
    }
]

尝试的代码

x = all_writing_test_name_data

# printing original list
print("The original list is : " + str(x))

import operator
from functools import reduce
all_keys = reduce(operator.or_, (d.keys() for d in x))

bar = {key: [d.get(key) for d in x] for key in all_keys}

print('bar', bar['writing_test'] + bar['writing_test_description'])

from collections import Counter
result = Counter()
for d in x:
    result[d['writing_test']] = d['writing_test']
    result[d['writing_test_description']] = d['writing_test_description']
print(result)

z = bar['writing_test'] + bar['writing_test_description']

print bar

代码问题分析

  • 核心逻辑偏离:代码完全没有围绕subject_id分组的需求展开,反而在做键的批量收集、字符串列表拼接、Counter统计等无关操作,完全没触及按subject_id聚合数据的核心。
  • 错误的数据处理方式:用reduce和operator.or_收集所有键后生成的bar字典,是把所有条目按键拆分为值列表,这和按subject_id分组整合的目标完全不符。
  • 无效操作冗余:Counter部分仅对writing_test和writing_test_description做了重复值的存储,既没有分组也没有生成目标结构,属于无效代码。

正确实现方法

方法一:普通循环+临时字典分组

这是最直观的实现方式,通过临时字典按subject_id聚合数据,最后转换为目标格式:

# 临时字典,键为subject_id,值为对应的条目列表
subject_groups = {}

for item in all_writing_test_name_data:
    sub_id = item['subject_id']
    # 复制条目并移除subject_id,避免重复存储
    writing_item = item.copy()
    del writing_item['subject_id']
    
    if sub_id not in subject_groups:
        subject_groups[sub_id] = []
    subject_groups[sub_id].append(writing_item)

# 转换为目标格式的列表
result = [{'subject_id': sid, 'writing_items': items} for sid, items in subject_groups.items()]

print(result)

方法二:使用itertools.groupby

注意使用groupby前需要先按subject_id排序,因为groupby只会聚合连续的相同键条目:

from itertools import groupby

# 先按subject_id排序
sorted_data = sorted(all_writing_test_name_data, key=lambda x: x['subject_id'])

result = []
for sub_id, group in groupby(sorted_data, key=lambda x: x['subject_id']):
    # 处理每组内的条目,移除subject_id
    writing_items = []
    for item in group:
        temp = item.copy()
        del temp['subject_id']
        writing_items.append(temp)
    result.append({'subject_id': sub_id, 'writing_items': writing_items})

print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:26:14