如何按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
相关产品推荐
相关产品推荐

