Python成绩处理问题:匹配字母成绩列表与字典值并计算平均
问题
我正在完成一项Python作业,需求如下:
- 编写程序接收4个字母成绩(A+至F,支持大小写),剔除最低分后计算平均分,并显示最低分和平均分
- 分两个文件实现:
letter_grade_avg.py(含main函数)和grade_compute.py(存放处理函数) - 自定义4个及以上函数,支持输入Q/q退出
目前已完成主文件的循环输入逻辑,但遇到的核心问题是:如何将收集到的字母成绩列表与grade_compute.py中的成绩值字典匹配,找出最低分并剔除,再计算平均分并转换回字母成绩。
现有代码:
letter_grade_avg.py
def main(): done = False while not done: done = processLine() ## Process one line of input ## @return True if the sentinel was encountered or false otherwise grade_list = [] def processline(): for x in range(50): for x in range(1): grade_list = [] print('Enter letter grades such as a, A, B+, c-, D+') grade1 = input('Enter the first grade or Q to quit: ').upper() if grade1 == 'Q': #will either take a grade and add to list or quit exit(0) else: grade_list.append(grade1) #will now take rest of grades and ammend to the list grade2 = input('Enter the second grade: ').upper() grade_list.append(grade2) grade3 = input('Enter the third grade: ').upper() grade_list.append(grade3) grade4 = input('Enter the fourth grade: ').upper() grade_list.append(grade4) print('You entered the grades ', grade_list) from grade_compute import gradeToNumber gradeToNumber(grade_list) processline()
grade_compute.py
def gradeToNumber(grade_list): grade_values = {'F-':1, 'F':2, 'F+':3, 'D-':4, 'D':5, 'D+':6, 'C-':7, 'C':8, 'C+':9, 'B-':10, 'B':11, 'B+':12, 'A-':13, 'A':14, 'A+':15 }
尝试过解压列表和字典、用if语句检查列表项是否在字典中,但都没成功,需要帮助。
解决方案
第一步:重构grade_compute.py,拆分出多个符合要求的函数
将逻辑拆分为字母转数值、数值转字母、查找最低分、计算平均分四个核心函数,同时复用全局成绩映射字典:
# grade_compute.py # 全局成绩映射字典,避免重复创建 GRADE_VALUES = { 'F-': 1, 'F': 2, 'F+': 3, 'D-': 4, 'D': 5, 'D+': 6, 'C-': 7, 'C': 8, 'C+': 9, 'B-': 10, 'B': 11, 'B+': 12, 'A-': 13, 'A': 14, 'A+': 15 } # 字母成绩转数值 def letter_to_number(letter_grade): return GRADE_VALUES.get(letter_grade.upper(), None) # 数值转字母成绩(处理小数平均分,取最接近的映射) def number_to_letter(numeric_grade): reverse_map = {v: k for k, v in GRADE_VALUES.items()} closest_value = min(reverse_map.keys(), key=lambda x: abs(x - numeric_grade)) return reverse_map[closest_value] # 找出列表中的最低分字母及其索引 def find_lowest_grade(grade_list): grade_numbers = [letter_to_number(g) for g in grade_list] min_num = min(grade_numbers) lowest_index = grade_numbers.index(min_num) return grade_list[lowest_index], lowest_index # 计算剔除最低分后的平均分(数值) def calculate_average(grade_list): _, lowest_idx = find_lowest_grade(grade_list) filtered_grades = grade_list[:lowest_idx] + grade_list[lowest_idx+1:] total = sum([letter_to_number(g) for g in filtered_grades]) return total / len(filtered_grades)
第二步:修改letter_grade_avg.py,修复循环逻辑并调用处理函数
移除冗余嵌套循环,将输入处理、结果展示拆分为独立函数,优化导入逻辑:
# letter_grade_avg.py from grade_compute import letter_to_number, find_lowest_grade, calculate_average, number_to_letter def process_input(): print('Enter letter grades such as a, A, B+, c-, D+') # 第一个输入支持退出 grade1 = input('Enter the first grade or Q to quit: ').upper() if grade1 == 'Q': return None # 收集剩余3个成绩 grade2 = input('Enter the second grade: ').upper() grade3 = input('Enter the third grade: ').upper() grade4 = input('Enter the fourth grade: ').upper() # 验证所有成绩有效性 grade_list = [grade1, grade2, grade3, grade4] for g in grade_list: if letter_to_number(g) is None: print(f"Error: '{g}' is not a valid grade. Please try again.") return [] return grade_list def display_results(grade_list): lowest_grade, _ = find_lowest_grade(grade_list) avg_numeric = calculate_average(grade_list) avg_letter = number_to_letter(avg_numeric) print(f"\nYou entered: {grade_list}") print(f"Lowest grade removed: {lowest_grade}") print(f"Average score (numeric): {avg_numeric:.2f}") print(f"Average grade (letter): {avg_letter}\n") def main(): while True: grade_list = process_input() if grade_list is None: print("Exiting program...") break if grade_list: display_results(grade_list) if __name__ == "__main__": main()
关键逻辑说明
- 成绩匹配:通过
letter_to_number统一将输入转为大写后匹配字典,解决大小写不兼容问题 - 最低分查找:先将所有字母转成数值,定位最小数值对应的原字母,再通过索引剔除该成绩
- 平均分转换:计算数值平均分后,反转字典找到最接近的字母成绩,处理小数情况
- 函数拆分:最终包含
letter_to_number、number_to_letter、find_lowest_grade、calculate_average、process_input、display_results多个自定义函数,满足作业要求
内容的提问来源于stack exchange,提问作者ThunderBolt
相关产品推荐
相关产品推荐

