Python如何按多个字典键分组 按年份与城市聚合date及pts字段
实现方法
你提前提取的list_year和list_city可用于后续结果过滤,若你的原始数据所有年份、城市都在这两个列表范围内,也可以不用额外调用。以下提供2种无第三方依赖的纯Python实现:
方法1:字典做中间缓存(推荐,逻辑简单,无需提前排序)
# 用(year, city)元组作为分组唯一键 group_map = {} for item in list_pts: key = (item['year'], item['city']) # 键不存在时初始化结构 if key not in group_map: group_map[key] = {'year': item['year'], 'city': item['city'], 'date': [], 'pts': []} # 追加同组的对应字段 group_map[key]['date'].append(item['date']) group_map[key]['pts'].append(item['pts']) # 转成期望的列表格式,需要和示例pts排序一致的话可以加sorted处理 output = [] for v in group_map.values(): v['pts'] = sorted(v['pts']) output.append(v)
方法2:使用itertools.groupby实现
注意groupby仅会将连续相同键的元素分为一组,因此分组前必须先按year和city排序:
import itertools # 先按分组字段排序 sorted_pts = sorted(list_pts, key=lambda x: (x['year'], x['city'])) output = [] for (year, city), group in itertools.groupby(sorted_pts, key=lambda x: (x['year'], x['city'])): date_list = [] pts_list = [] for item in group: date_list.append(item['date']) pts_list.append(item['pts']) output.append({'year': year, 'city': city, 'date': date_list, 'pts': sorted(pts_list)})
可选:使用pandas简化代码
如果允许使用第三方数据分析库pandas,代码会更简洁:
import pandas as pd df = pd.DataFrame(list_pts) # 按year、city分组,其余字段聚合为列表 output = df.groupby(['year', 'city'], as_index=False).agg(list).to_dict('records')
内容的提问来源于stack exchange,提问作者Maxime Lara
相关产品推荐
相关产品推荐

