You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键逻辑说明

  1. 成绩匹配:通过letter_to_number统一将输入转为大写后匹配字典,解决大小写不兼容问题
  2. 最低分查找:先将所有字母转成数值,定位最小数值对应的原字母,再通过索引剔除该成绩
  3. 平均分转换:计算数值平均分后,反转字典找到最接近的字母成绩,处理小数情况
  4. 函数拆分:最终包含letter_to_number、number_to_letter、find_lowest_grade、calculate_average、process_input、display_results多个自定义函数,满足作业要求

内容的提问来源于stack exchange,提问作者ThunderBolt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:47:44