python - Calculating weighted average from a list -
this 1 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 calculated weight .1, 96 weight .1, 72 weight .15, 88 weight .05, average of (71,80,83,77,90,88,95,71,76,94) calculated weight .3, 80 calculated weight .08, 74 weight .08, 98 .09 , lastly 77 .05. each score should multiplied appropriate weight.
here function
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))
the expected value should 82.94 getting 78.48
you slicing outer list:
student_scores[4:5][0]
slicing produces new list, in case 1 element, [0]
selects that nested list:
>>> 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']
perhaps want use student_scores[4][0]
(no slicing, 4th element) instead? that'd produce '71'
:
>>> student_scores[4][0] '71'
you skipping student_scores[5]
, , indexerror
student_scores[9]
, doesn't exist.
you want avoid typing direct references; specify weights sequence , use zip()
generator expression , sum()
calculate weighted 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 s, w in zip(student_scores, weights))
this uses isinstance(s, list)
detect 1 list object , extract first value that.
if need average of the nested list, calculate on spot:
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 s, w in zip(student_scores, weights))
the average()
function here converts each string in list integer, sums integers , divides result length of list. sum()
started floating point 0.0 force total float, makes sure division producing float, matters on python 2.
Comments
Post a Comment