我想知道是否有一种有效的方法来计算每个班级的平均值。
例如:
scores = [1, 2, 3, 4, 5]
classes = [0, 0, 1, 1, 1]
预期输出为
output = [[0, 1.5],
[1, 4.0]]
其中输出为[[class_indx,avg_value],...]
我可以使用字典来实现。但这意味着我需要先将数组(此示例中的列表)转换为dict,然后在完成工作后再转换回数组。在这种情况下,这似乎是一种解决方法,我希望直接在数组上进行操作。
我想有人发明了这个轮子,但只是我还没有从搜索中找出来。有什么方法可以有效地做到这一点?
谢谢。
答案 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]]