这看起来很简单,但我无法弄清楚。我有十个类别和分数分配给他们每个人。在中间步骤中,我将结果存储为[“得分”,重复]对,如:
[20,3]
[40,7]
[50,2]
...
我最终要做的是将这些对扩展为重复的数字,然后合并并平均得到一个这样的分数:
[20,20,20]
[40,40,40,40,40,40,40]
[50,50]
合并:
[20,20,20,40,40,40,40,40,40,40,50,50]
sum([20,20,20,40,40,40,40,40,40,40,50,50],0.0)/12
最终结果(平均):37
那么我如何完成第2步,我将每对的分数扩展X倍?如果它们是字符串,我可以这样做,但必须有一种数字方式来实现它。
答案 0 :(得分:8)
你可以这样做:
>>> a = [20,3]
>>> [a[0]] * a[1]
[20, 20, 20]
然而,这一步并非真的有必要。要获得加权平均值,您可以将这些值乘以权重,求和,然后除以权重之和,例如:
float(20*3 + 40*7 + 50*2) / (3 + 7 + 2)
转换为float是为了避免Python 2中的整数除法。
可以这样写:
>>> xs = [[20,3], [40,7], [50,2]]
>>> float(sum(x[0] * x[1] for x in xs)) / sum(x[1] for x in xs)
36.666666666666664
答案 1 :(得分:3)
如果您想扩展列表,它就像:
一样简单x = [20, 3] # for example
# a list consisting of x[1] copies, of a list that contains only x[0]:
expanded = [x[0]] * x[1]
但是,对于您所描述的问题,您实际上并不想要或不需要。你真正在做的是计算weighted average,其中第二个值是你的权重。
为此,我们可以将这些对相乘,添加这些结果,然后除以权重之和:
values = [[20, 3], [40, 7], [50, 2]]
total = sum(x[0] * x[1] for x in values)
weight = sum(x[1] for x in values)
average = float(total) / weight
# Or, more directly:
average = float(sum(x[0] * x[1] for x in values)) / sum(x[1] for x in values)
答案 2 :(得分:1)
如果您只想获得平均值,是否需要创建扩展列表?
我建议你做一个加权平均值。
count = sum(k[1] for k in scores) # this is the count of items
total = sum(k[0] * k[1] for k in scores) # this is the sum of scores
out = total / count