按列表首元素分组计算均值:寻求更Pythonic的实现方法
当然有更Pythonic的实现方式啦!不用依赖pandas,用Python标准库就能轻松搞定,这里给你两种实用的思路:
方法一:用collections.defaultdict(推荐,无需排序)
这种方法不需要提前对列表排序,直接遍历分组,逻辑直观易懂,非常适合处理无序的原始数据:
from collections import defaultdict from statistics import mean # 用标准库的mean函数更简洁 l = [(('01001', '01003'), 4.15), (('01001', '01005'), 2.83), (('01001', '01007'), 3.32), (('01002', '01009'), 6.83), (('01002', '01011'), 2.53), (('01003', '01013'), 20.50), (('01003', '01013'), 20.50)] # 初始化一个默认值为列表的字典,用来收集每个分组的数值 grouped_data = defaultdict(list) for (primary_key, _), value in l: grouped_data[primary_key].append(value) # 计算每个分组的均值 result = {key: mean(values) for key, values in grouped_data.items()} print(result) # 输出: {'01001': 3.433333333333333, '01002': 4.68, '01003': 20.5}
方法二:用itertools.groupby(适合有序列表)
如果你的原始列表已经是按分组键(比如'01001'这类首项)连续排列的,用groupby会更高效;如果无序,需要先排序:
from itertools import groupby from statistics import mean from operator import itemgetter l = [(('01001', '01003'), 4.15), (('01001', '01005'), 2.83), (('01001', '01007'), 3.32), (('01002', '01009'), 6.83), (('01002', '01011'), 2.53), (('01003', '01013'), 20.50), (('01003', '01013'), 20.50)] # 先按分组键排序(如果原列表已经有序可以跳过这一步) sorted_list = sorted(l, key=lambda x: x[0][0]) # 按首项分组并计算均值 result = {} for key, group in groupby(sorted_list, key=lambda x: x[0][0]): # 提取当前组的所有数值 values = [item[1] for item in group] result[key] = mean(values) print(result) # 输出和上面一致
小提示
用statistics.mean代替自己写sum(values)/len(values)会更Pythonic,而且它还能处理一些 edge case(比如空列表会抛出合理的异常,而不是返回NaN)。
这两种方法都属于纯标准库实现,不需要额外安装依赖,完全符合Pythonic的简洁、高效原则,你可以根据自己的列表是否有序来选择合适的方法~
内容的提问来源于stack exchange,提问作者cwohlfart
相关产品推荐
相关产品推荐

