如何将字典列表中相同class值的条目进行roll值分组合并
按class分组合并roll列表的实现方法
给定如下字典列表数据(其中roll值均唯一,class值可重复):
original_list = [ {'roll':101 , 'class':10}, {'roll':102 , 'class':10}, {'roll':103 , 'class':10}, {'roll':104 , 'class':11}, {'roll':105 , 'class':11}, {'roll':106 , 'class':11}, {'roll':107 , 'class':12}, {'roll':108 , 'class':12}, {'roll':109 , 'class':12} ]
需要将其转换为以下格式,按class分组,将同组的roll值合并为列表:
new_list = [ {'roll':[101,102,103] , 'class':10}, {'roll':[104,105,106] , 'class':11}, {'roll':[107,108,109] , 'class':12} ]
以下是几种可行的实现方法:
方法一:基础字典分组(无依赖)
通过遍历原始列表,用class作为键收集对应的roll值,最后转换为目标格式:
original_list = [ {'roll':101 , 'class':10}, {'roll':102 , 'class':10}, {'roll':103 , 'class':10}, {'roll':104 , 'class':11}, {'roll':105 , 'class':11}, {'roll':106 , 'class':11}, {'roll':107 , 'class':12}, {'roll':108 , 'class':12}, {'roll':109 , 'class':12} ] # 分组收集roll数据 grouped_data = {} for item in original_list: cls = item['class'] roll = item['roll'] if cls not in grouped_data: grouped_data[cls] = [] grouped_data[cls].append(roll) # 转换为目标字典列表 new_list = [{'roll': rolls, 'class': cls} for cls, rolls in grouped_data.items()] print(new_list)
该方法逻辑直观,无需额外依赖,适合小数据量场景。
方法二:使用标准库itertools.groupby
利用itertools.groupby按class分组,注意需先将原始列表按class排序(groupby仅对连续相同键的元素分组):
from itertools import groupby original_list = [ {'roll':101 , 'class':10}, {'roll':102 , 'class':10}, {'roll':103 , 'class':10}, {'roll':104 , 'class':11}, {'roll':105 , 'class':11}, {'roll':106 , 'class':11}, {'roll':107 , 'class':12}, {'roll':108 , 'class':12}, {'roll':109 , 'class':12} ] # 按class排序(若原始数据已按class有序可省略此步骤) sorted_list = sorted(original_list, key=lambda x: x['class']) # 分组并生成目标列表 new_list = [] for cls, group in groupby(sorted_list, key=lambda x: x['class']): roll_list = [item['roll'] for item in group] new_list.append({'roll': roll_list, 'class': cls}) print(new_list)
该方法借助标准库工具简化代码,适合有序或可排序的数据场景。
方法三:使用pandas处理大数据量
若数据量较大,pandas的分组聚合功能效率更高,同时支持更多扩展操作:
import pandas as pd original_list = [ {'roll':101 , 'class':10}, {'roll':102 , 'class':10}, {'roll':103 , 'class':10}, {'roll':104 , 'class':11}, {'roll':105 , 'class':11}, {'roll':106 , 'class':11}, {'roll':107 , 'class':12}, {'roll':108 , 'class':12}, {'roll':109 , 'class':12} ] # 转换为DataFrame df = pd.DataFrame(original_list) # 按class分组,聚合roll为列表 grouped_df = df.groupby('class')['roll'].agg(list).reset_index() # 转换为字典列表 new_list = grouped_df.to_dict('records') print(new_list)
该方法适合大规模数据集,且能结合pandas的其他数据处理能力完成复杂需求。
内容的提问来源于stack exchange,提问作者VentilaterR
相关产品推荐
相关产品推荐

