这是一个列表
[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
答案 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上有用。