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

冒泡排序算法结合字典的使用疑问及学生成绩排序程序故障求助

嘿,我来帮你解决这两个问题:程序错误修复 + 字典排序解惑

一、先搞定你的学生成绩管理程序问题

你的代码里有几个关键小问题导致功能异常,我逐一给你指出来并修正:

1. list_organizer函数的变量作用域bug

你在函数里直接用了外部的total变量,这很容易出问题——比如如果函数外的total被修改,函数逻辑就乱了。应该把total作为参数传入函数:

def list_organizer(record, total):  # 新增total参数
    if 75 <= total <= 100:
        listA.append(record)
        print("It's in A")
    elif 50 <= total <= 74:
        listB.append(record)
        print("It's in B")
    elif 25 <= total <= 49:
        listC.append(record)
        print("It's in C")
    elif 0 <= total <= 24:
        listD.append(record)
        print("It's in D")
    else:
        print('Error!, The grades you’ve entered are invalid.')

调用的时候记得传total:

list_organizer(record, total)

2. input(print(...))的错误用法

print()会返回None,所以你写的input(print("xxx"))会先打印提示,然后把None显示在输入框里,看起来很奇怪。正确写法是直接把提示文本放进input():

name = str(input("Please enter the student's name."))
grade = float(input("Please enter the student's grade for the 1st term."))
# 其他input语句都这么改

3. no_symbols函数的字符检测逻辑不对

你现在是判断整个姓名是否在符号列表里,这根本检测不出姓名里混着符号的情况(比如"Tom!")。应该遍历姓名的每个字符:

def no_symbols(x):
    invalid_chars = "(¬!”£$%^&*()-_)"
    for char in x:
        if char in invalid_chars:
            print("You’ve entered an invalid character")
            exit()

4. 冒泡排序逻辑没问题,但可以适配字典格式

你当前用元组(total, name)存储记录,排序时比较x[j][0](总分)是对的。如果后续换成字典存储(比如{"total": total, "name": name}),只需要把排序逻辑改成比较字典的对应key:

if x[j]["total"] < x[j + 1]["total"]:  # 按总分降序
    x[j], x[j + 1] = x[j + 1], x[j]

修正后的完整代码如下:

listA = []
listB = []
listC = []
listD = []
i = 1

def list_organizer(record, total):
    if 75 <= total <= 100:
        listA.append(record)
        print("It's in A")
    elif 50 <= total <= 74:
        listB.append(record)
        print("It's in B")
    elif 25 <= total <= 49:
        listC.append(record)
        print("It's in C")
    elif 0 <= total <= 24:
        listD.append(record)
        print("It's in D")
    else:
        print('Error!, The grades you’ve entered are invalid.')

def bubble_sort(x):
    n = len(x)
    for i in range(n):
        for j in range(n - i - 1):
            if x[j][0] < x[j + 1][0]:
                x[j], x[j + 1] = x[j + 1], x[j]
    return x

def no_symbols(x):
    invalid_chars = "(¬!”£$%^&*()-_)"
    for char in x:
        if char in invalid_chars:
            print("You’ve entered an invalid character")
            exit()

while i != 0:
    total = 0
    name = str(input("Please enter the student's name."))
    no_symbols(name)
    grade = float(input("Please enter the student's grade for the 1st term."))
    grade2 = float(input("Please enter the student's grade for the 2nd term."))
    grade3 = float(input("Please enter the student's grade for the 3rd term."))
    total = float(grade+grade2+grade3)/3
    print("Final Grade:", round(total, 2),"||||", "Student Name:", name ,"\n")
    record = (total,name)
    list_organizer(record, total)
    print("\n||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n")
    i = int(input("Press 1 to enter another student else press 0 to see results"))

print("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||")
print("List A", bubble_sort(listA))
print("List B", bubble_sort(listB))
print("List C", bubble_sort(listC))
print("List D", bubble_sort(listD))

二、关于字典排序的疑惑,给你理清楚

首先明确:Python 3.7+的字典是有序的,但我们说的"对字典排序",通常分两种场景:

1. 对单个字典的元素排序

如果有一个单独的字典,比如student = {"name": "Alice", "math": 90, "english": 85},你可以这样操作:

  • 按键排序:sorted(student.keys()) → 得到按字母顺序排列的键列表
  • 按值排序:sorted(student.values()) → 得到按数值从小到大排列的值列表
  • 按键值对排序:sorted(student.items(), key=lambda item: item[1]) → 按值从小到大排序键值对;如果要按键排序,用key=lambda item: item[0]

2. 对包含字典的列表排序(这才是你大概率需要的场景)

如果你的学生记录用字典存储,比如:

record = {"total": total, "name": name}

要对这个列表做冒泡排序,只需要修改比较逻辑——选择字典里的某个key作为排序依据,比如按总分降序:

def bubble_sort(x):
    n = len(x)
    for i in range(n):
        for j in range(n - i - 1):
            # 比较每个字典的"total"值
            if x[j]["total"] < x[j + 1]["total"]:
                x[j], x[j + 1] = x[j + 1], x[j]
    return x

如果要按姓名的字母顺序排序,就改成:

if x[j]["name"] > x[j + 1]["name"]:  # 升序用<,降序用>
    x[j], x[j + 1] = x[j + 1], x[j]

总结:选按key还是items排序?

  • 如果是处理单个字典,你可以根据需求选按键、值或键值对排序;
  • 如果是处理存字典的列表,核心是选字典里的某个key(比如你的total或name)作为排序标准,本质是比较每个字典中该key对应的值,而不是对字典的items整体排序。

内容的提问来源于stack exchange,提问作者Jaime Difo Lorenzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:39:09