基于groupby的JSON格式化后续:按日期分组重组数据
按day分组格式化字典列表
这是此前《Normalize JSON format in python with groupby》问题的后续需求:将给定的字典列表按day字段分组,把关联的area和num值整理为对应列表(单个数据时保留原值)。
样例数据
data = [ {'info': {'area': 'USA', 'other': 'cat'}, 'day': '1-1-2012', 'num': 12}, {'info': {'area': 'KSA', 'other': 'bat'}, 'day': '1-1-2012', 'num': 52}, {'info': {'area': 'KSA', 'other': 'fat'}, 'day': '4-3-2012', 'num': 34} ]
实现代码
from itertools import groupby # 先按day排序,确保groupby能正确分组(groupby仅对连续相同键分组) sorted_data = sorted(data, key=lambda x: x['day']) result = [] for day, group in groupby(sorted_data, key=lambda x: x['day']): items = list(group) # 提取当前分组的所有area和num值 areas = [item['info']['area'] for item in items] nums = [item['num'] for item in items] # 单个元素时取原值,多个元素时保留列表 area_val = areas[0] if len(areas) == 1 else areas num_val = nums[0] if len(nums) == 1 else nums # 组装结果字典 result.append({ 'day': day, 'area': area_val, 'num': num_val }) print(result)
输出结果
[ {'day': '1-1-2012', 'area': ['USA', 'KSA'], 'num': [12, 52]}, {'day': '4-3-2012', 'area': 'KSA', 'num': 34} ]
关键说明
itertools.groupby依赖连续相同的分组键,因此必须先对数据按day排序,否则会出现同day数据被拆分到多个分组的情况。- 通过判断收集到的
area、num列表长度,决定最终存储单个值还是列表,完全匹配需求格式。
内容的提问来源于stack exchange,提问作者user22391597
相关产品推荐
相关产品推荐

