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

如何在Python学生成绩管理程序中删除学生记录?

学生成绩管理脚本问题

需求:

  • 编写Python脚本,支持输入学生姓名、课程作业成绩、考试成绩并存储,其中课程作业和考试成绩需验证为0-100的数值
  • 程序需包含以下菜单功能:
    1. 添加新学生记录
    2. 查看所有学生记录
    3. 删除学生记录
    4. 显示课程作业成绩总平均分
    5. 显示考试成绩总平均分
    6. 显示所有综合成绩
    7. 显示综合成绩总平均分
    8. 退出

问题:不知道如何正确从列表中删除学生记录及对应姓名,以下是我编写的代码:

studentlist=[]
menu=1
while menu!=0:
    print ("""
1. Add new student records
2. Show all student records
3. Delete a student record
4. Dislay overall average coursework mark
5. Display overall average exam mark
6. Display all aggregate marks
7. Display overall average aggregate mark
0. Exit
Plese select an option
       """)
    menu=int(input(""))

    
    if menu==1:
        promptdict1 = {'name': 'Enter a students name: ', \
                       'cmark': 'Enter the students coursework mark: ', \
                       'emark': 'Enter the students exam mark: '}
        studentlist.append({'name': input(promptdict1['name']), \
                            'cmark': int(input(promptdict1['cmark'])), \
                            'emark': int(input(promptdict1['emark']))})
        print(studentlist[-1])


        
    elif menu==2:
        promptdict2 = {'name': 'Name:', \
                       'cmark': 'Courswork mark:', \
                       'emark': 'Exam mark:'}
        for student in studentlist:
            print(promptdict2['name'], student['name'])
            print(promptdict2['cmark'], student['cmark'])
            print(promptdict2['emark'], student['emark'], '\n')


            
    elif menu==3:
        name=input("Enter a students name: ")
        for n in studentlist:
            if n['name']==name:
                studentlist.remove(n)

    elif menu==4:
        total=0
        total_students=len(studentlist)
        for n in studentlist:
             total+=n['cmark']
        print("Overall average coursework mark: "+str(total/total_students))
         
            
    elif menu==5:
        total=0
        total_students2=len(studentlist)
        for n in studentlist:
             total+=n['emark']
        print("Overall average Exam mark: "+str(total/total_students2))
                       
        

    elif menu==0:
        break

解决方案

1. 修复删除学生记录的问题

原代码遍历列表时直接调用remove()会导致列表长度变化,后续元素被跳过,可能漏删同名学生或引发异常。推荐用列表推导式过滤掉要删除的学生,逻辑更稳定:

elif menu==3:
    name = input("输入要删除的学生姓名:")
    # 保留非目标学生,自动过滤要删除的记录
    studentlist = [stu for stu in studentlist if stu['name'] != name]
    print(f"已删除所有名为{name}的学生记录")

2. 补充成绩输入验证

添加循环验证逻辑,确保课程作业和考试成绩是0-100之间的整数:

def get_valid_score(prompt):
    while True:
        try:
            score = int(input(prompt))
            if 0 <= score <= 100:
                return score
            else:
                print("成绩必须在0-100之间,请重新输入")
        except ValueError:
            print("输入无效,请输入整数")

# 在添加学生的分支中替换原输入逻辑:
elif menu==1:
    name = input("输入学生姓名:")
    cmark = get_valid_score("输入课程作业成绩:")
    emark = get_valid_score("输入考试成绩:")
    studentlist.append({'name': name, 'cmark': cmark, 'emark': emark})
    print(f"已添加学生记录:{studentlist[-1]}")

3. 完善菜单选项(修正退出选项为8,实现缺失的6、7功能)

假设综合成绩为(课程作业成绩 + 考试成绩) / 2,补充对应功能:

# 更新菜单打印内容为中文:
print("""
1. 添加新学生记录
2. 查看所有学生记录
3. 删除学生记录
4. 显示课程作业成绩总平均分
5. 显示考试成绩总平均分
6. 显示所有综合成绩
7. 显示综合成绩总平均分
8. 退出
请选择操作选项:
""")

# 补充选项6的逻辑:
elif menu==6:
    if not studentlist:
        print("暂无学生记录")
        continue
    print("所有学生综合成绩:")
    for stu in studentlist:
        aggregate = (stu['cmark'] + stu['emark']) / 2
        print(f"{stu['name']}: {aggregate:.2f}")

# 补充选项7的逻辑:
elif menu==7:
    if not studentlist:
        print("暂无学生记录")
        continue
    total_aggregate = sum((stu['cmark'] + stu['emark']) / 2 for stu in studentlist)
    avg_aggregate = total_aggregate / len(studentlist)
    print(f"综合成绩总平均分:{avg_aggregate:.2f}")

# 修正退出选项为8:
elif menu==8:
    print("程序退出")
    break

完整修正后的代码

studentlist = []

def get_valid_score(prompt):
    while True:
        try:
            score = int(input(prompt))
            if 0 <= score <= 100:
                return score
            else:
                print("成绩必须在0-100之间,请重新输入")
        except ValueError:
            print("输入无效,请输入整数")

while True:
    print("""
1. 添加新学生记录
2. 查看所有学生记录
3. 删除学生记录
4. 显示课程作业成绩总平均分
5. 显示考试成绩总平均分
6. 显示所有综合成绩
7. 显示综合成绩总平均分
8. 退出
请选择操作选项:
    """)
    try:
        menu = int(input())
    except ValueError:
        print("请输入有效的数字选项")
        continue

    if menu == 1:
        name = input("输入学生姓名:")
        cmark = get_valid_score("输入课程作业成绩:")
        emark = get_valid_score("输入考试成绩:")
        studentlist.append({'name': name, 'cmark': cmark, 'emark': emark})
        print(f"已添加学生记录:{studentlist[-1]}")

    elif menu == 2:
        if not studentlist:
            print("暂无学生记录")
            continue
        print("所有学生记录:")
        for stu in studentlist:
            print(f"姓名:{stu['name']}")
            print(f"课程作业成绩:{stu['cmark']}")
            print(f"考试成绩:{stu['emark']}\n")

    elif menu == 3:
        if not studentlist:
            print("暂无学生记录可删除")
            continue
        name = input("输入要删除的学生姓名:")
        original_length = len(studentlist)
        studentlist = [stu for stu in studentlist if stu['name'] != name]
        if len(studentlist) < original_length:
            print(f"已删除所有名为{name}的学生记录")
        else:
            print(f"未找到名为{name}的学生记录")

    elif menu == 4:
        if not studentlist:
            print("暂无学生记录")
            continue
        total_cmark = sum(stu['cmark'] for stu in studentlist)
        avg_cmark = total_cmark / len(studentlist)
        print(f"课程作业成绩总平均分:{avg_cmark:.2f}")

    elif menu == 5:
        if not studentlist:
            print("暂无学生记录")
            continue
        total_emark = sum(stu['emark'] for stu in studentlist)
        avg_emark = total_emark / len(studentlist)
        print(f"考试成绩总平均分:{avg_emark:.2f}")

    elif menu == 6:
        if not studentlist:
            print("暂无学生记录")
            continue
        print("所有学生综合成绩:")
        for stu in studentlist:
            aggregate = (stu['cmark'] + stu['emark']) / 2
            print(f"{stu['name']}:{aggregate:.2f}")

    elif menu == 7:
        if not studentlist:
            print("暂无学生记录")
            continue
        total_aggregate = sum((stu['cmark'] + stu['emark']) / 2 for stu in studentlist)
        avg_aggregate = total_aggregate / len(studentlist)
        print(f"综合成绩总平均分:{avg_aggregate:.2f}")

    elif menu == 8:
        print("程序退出")
        break

    else:
        print("无效选项,请重新输入")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:10:31