You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按列表首元素分组计算均值:寻求更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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:37:52