从列表中计算加权平均值
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.
上很重要
这是一个列表
[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.