从列表中计算加权平均值

时间:2016-05-25 00:28:43

标签: python weighted-average

这是一个列表

[74.0, 96.0, 72.0, 88.0, ['71', '80', '83', '77', '90', '88', '95', '71', '76', '94'], 80.0, 74.0, 98.0, 77.0]

74的计算重量为.1,96,重量为.1,72,重量为.15,88,重量为.05,平均值为(71,80,83,77,90,88,95) ,71,76,94)用重量.3,80计算,重量.08,74,重量.08,98,用.09,最后77,用0.05。每个分数应乘以适当的权重。

这是函数

def weighted_total_score(student_scores):
    return((int(student_scores[0])*.1)+(int(student_scores[1])*.1)+(int(student_scores[2])*.15)+(int(student_scores[3])*.05)+(int(student_scores[4][0])*.3)+(int(student_scores[5])*.08)+(int(student_scores[5])*.08)+(int(student_scores[5])*.09)+(int(student_scores[8])*.05))

预期值应为82.94,但我得到78.48

1 个答案:

答案 0 :(得分:2)

切片外部列表:

student_scores[4:5][0]

切片会产生一个新列表,在这种情况下只有一个元素,[0]选择嵌套列表

>>> student_scores = [74.0, 96.0, 72.0, 88.0, ['71', '80', '83', '77', '90', '88', '95', '71', '76', '94'], 80.0, 74.0, 98.0, 77.0]
>>> student_scores[4:5]
[['71', '80', '83', '77', '90', '88', '95', '71', '76', '94']]
>>> student_scores[4:5][0]
['71', '80', '83', '77', '90', '88', '95', '71', '76', '94']

也许你想使用student_scores[4][0](没有切片,只是第4个元素)?这会产生'71'

>>> student_scores[4][0]
'71'

您也在跳过student_scores[5]IndexError将获得student_scores[9],但不存在。

您可能希望避免键入所有这些直接引用;将权重指定为序列,并使用带有生成器表达式的zip()sum()来计算加权和:

def weighted_total_score(student_scores):
    weights = .1, .1, .15, .05, .3, .08, .08, .09, .05                 
    return sum(int(s[0] if isinstance(s, list) else s) * w
               for s, w in zip(student_scores, weights))

这使用isinstance(s, list)来检测一个列表对象并从中提取第一个值。

如果您需要嵌套列表的平均值,请在现场计算:

def average(string_scores):
    return sum(map(int, string_scores), 0.0) / len(string_scores)

def weighted_total_score(student_scores):
    weights = .1, .1, .15, .05, .3, .08, .08, .09, .05                 
    return sum(int(average(s[0]) if isinstance(s, list) else s) * w
               for s, w in zip(student_scores, weights))

average()函数将列表中的每个字符串转换为整数,然后对这些整数求和,并将结果除以列表的长度。 sum()以浮点0.0开始,强制总数为浮点数,这可以确保除法也产生一个浮点数,这只在Python 2上有用。