冒泡排序算法结合字典的使用疑问及学生成绩排序程序故障求助
嘿,我来帮你解决这两个问题:程序错误修复 + 字典排序解惑
一、先搞定你的学生成绩管理程序问题
你的代码里有几个关键小问题导致功能异常,我逐一给你指出来并修正:
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
相关产品推荐
相关产品推荐

