# calculate weighted student grades according to the formula # avg = 0.2 * homework + 0.3 * midterm + 0.5 * final # assume there may be multiple homework assignments and midterms, but # only one final. Input is of the form: # # name, assessmentType, score # # where assessmentType is one of hw, midterm, or final import sys import re from operator import itemgetter class student: def __init__(self): self.grades = {} self.grades['hw'] = [] self.grades['midterm'] = [] self.grades['final'] = [] def getWeightedAvg(self): hw = self.grades['hw'] midterm = self.grades['midterm'] # sum sums a list of integers hwAvg = sum(hw)/len(hw) midtermAvg = sum(midterm)/ len(midterm) final = self.grades['final'][0] return 0.2*hwAvg + 0.3*midtermAvg + 0.5*final def __lt__(self, obj): return self.getWeightedAvg() < obj.getWeightedAvg() fileHandle = open(sys.argv[1]) lines = fileHandle.readlines() students = {} for line in lines: line = line.strip() # get rid of newline characters (name, assessType, score) = re.split("\s*,\s*", line) if (name not in students): students[name] = student() students[name].grades[assessType].append(int(score)) for (name,s) in sorted(students.items(), key=itemgetter(1), reverse=True): print("{0} {1:.2f}".format(name, s.getWeightedAvg()))