如何为每个类计算数组的平均值?

时间:2019-08-12 12:15:36

标签: python

我想知道是否有一种有效的方法来计算每个班级的平均值。

例如:

scores = [1, 2, 3, 4, 5]
classes = [0, 0, 1, 1, 1]

预期输出为

output = [[0, 1.5],
          [1, 4.0]]

其中输出为[[class_indx,avg_value],...]

我可以使用字典来实现。但这意味着我需要先将数组(此示例中的列表)转换为dict,然后在完成工作后再转换回数组。在这种情况下,这似乎是一种解决方法,我希望直接在数组上进行操作。

我想有人发明了这个轮子,但只是我还没有从搜索中找出来。有什么方法可以有效地做到这一点?

谢谢。

1 个答案:

答案 0 :(得分:3)

具有itertools.groupby功能:

from itertools import groupby

scores = [1, 2, 3, 4, 5]
classes = [0, 0, 1, 1, 1]

res = []
for k, g in groupby(zip(scores, classes), key=lambda x: x[1]):
    group = list(g)
    res.append([k, sum(i[0] for i in group) / len(group)])

print(res)   # [[0, 1.5], [1, 4.0]]

或与collections.defauldict对象:

from collections import defauldict

scores = [1, 2, 3, 4, 5]
classes = [0, 0, 1, 1, 1]

d = defaultdict(list)
res = []
for sc, cl in zip(scores, classes):
    d[cl].append(sc)
res = [[cl, sum(lst)/len(lst)] for cl, lst in d.items()]

print(res)   # [[0, 1.5], [1, 4.0]]