从列表中计算加权平均值

Calculating weighted average from a list

这是一个列表

[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用权重0.1计算,96用权重0.1计算,72用权重0.15计算,88用权重0.05计算,(71,80,83,77,90,88 ,95,71,76,94) 以权重 0.3 计算,80 以权重 0.08 计算,74 以权重 0.08 计算,98 以 .09 计算,最后 77 以 .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

您正在切片外部列表:

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],并且将获得 student_scores[9]IndexError,这不存在。

您可能希望避免键入所有这些直接引用;将您的权重指定为一个序列,并使用 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.

上很重要