def make_gradebook():
return []
def make_module_info(module, grade):
module_info = (module,grade)
return module_info
def get_module(module_info):
return module_info[0]
def get_grade(module_info):
return module_info[1]
def get_level(module_info):
for i in module_info[0]:
if str.isdigit(i):
return i
def add_grade(gradebook, module_grade):
gradebook.append(module_grade)
return gradebook
def sort_by_module(gradebook):
gradebook.sort(key=lambda gradeb: gradeb[0])
return gradebook
def sort_by_level(gradebook):
gradebook.sort(key=lambda gradeb: get_level(gradeb))
return gradebook
def grade_to_numeric_marks(grade):
for i in grade:
if i[0] == 'A':
if i[1] == '+':
return 90
elif i[1] == '-':
return 80
else:
return 75
elif i[0] == 'B':
if i[1] == '+':
return 70
elif i[1] == '-':
return 65
else:
return 60
else:
if i[1] == '+':
return 55
elif i[1] == '-':
return 50
else:
return 46
return grade.sort()
def sort_by_grade(gradebook):
gradebook.sort(key=lambda gradeb: grade_to_numeric_marks(gradeb))
return gradebook
### for testing ###
gb = make_gradebook()
cs1010s = make_module_info('CS1010S', 'A+')
cs2020 = make_module_info('CS2020', 'A')
ma1101r = make_module_info('MA1101R', 'C')
ssa1207 = make_module_info('SSA1207', 'B+')
cs4247 = make_module_info('CS4247', 'A+')
ea5001 = make_module_info('EA5001', 'B')
add_grade(gb, cs1010s)
add_grade(gb, cs2020)
add_grade(gb, ma1101r)
add_grade(gb, ssa1207)
sort_by_grade(成绩簿):返回按模块等级从高到低排序的成绩簿的新副本.确保’A’出现在’A’之前
我使用了grade_to_numeric_marks(等级):作为辅助函数,但我仍然无法得到我想要的输出[(‘CS1010S’,’A’),(‘CS2020′,’A’),(‘SSA1207′ ,’B’),(‘MA1101R’,’C’)]怎么了?
最佳答案
如果您不是使用多个if / elif / else检查,则定义字典grade-> value和sign-value.然后,在关键函数grade_to_numeric_marks中,只需求每个等级的基点和每个符号的点数(/ – 或空).
例如(您可能需要调整每个等级/符号的值):
points = {'A': 80, 'B': 65}
signs = {'+': 10, '-': -5}
def grade_to_numeric_marks(item):
grade = item[1]
return points.get(grade[0], 50) + signs.get(grade[1:], 0)
def sort_by_grade(gradebook):
return sorted(gradebook, key=lambda x: grade_to_numeric_marks(x), reverse=True)
grades = [('CS1010S', 'A+'), ('MA1101R', 'C'), ('SSA1207', 'B+'), ('CS2020', 'A')]
print sort_by_grade(grades)
打印:
[('CS1010S', 'A+'), ('CS2020', 'A'), ('SSA1207', 'B+'), ('MA1101R', 'C')]
或者,正如@clutton在评论中提到的那样,只定义一个具有映射等级的字典:
{'A+': 95, 'A': 90 ... }
然后,您可以简化排序:
points = {'A+': 95, 'A': 90, 'B+': 70, 'B': 65, 'C+': 55, 'C': 50} # need to define all of the possible grades
grades = [('CS1010S', 'A+'), ('MA1101R', 'C'), ('SSA1207', 'B+'), ('CS2020', 'A')]
print sorted(grades, key=lambda x: points.get(x[1]), reverse=True)