如何实现输入学生roll与CGPA字典并仅按值排序(保留键值对)
按CGPA降序排序学生字典并保留学号对应关系的代码修正
我来帮你修正这段代码,完美实现按CGPA降序排序同时保留学号与成绩对应关系的需求。先看看原代码里的几个问题:
- 输入学号时没把输入值赋值给
roll变量,运行时会直接报NameError - 使用
sorted()函数时参数写错了:你用了roll作为参数名,正确应该是key;而且原代码是按学号(键)排序,不是按CGPA(值)排序 - 输入的CGPA是字符串类型,直接排序会出现数值排序错误(比如字符串"4"会排在"4.2"前面)
下面是修正后的完整代码:
dic = {} n = True while n: roll = input("Insert roll: ") # 给roll变量赋值,修复未定义错误 cgpa = float(input("Insert Your cgpa: ")) # 转换为浮点型,确保数值排序逻辑正确 dic[roll] = cgpa repeat = input("Want To add more? :") if repeat.lower() == 'no': # 兼容大小写输入,提升用户体验 n = False # 按CGPA降序排序,严格保留学号与成绩的对应关系 sorted_d = dict(sorted(dic.items(), key=lambda kv: kv[1], reverse=True)) # 格式化打印排序后的结果 print("\n排序后的学生成绩:") for roll, cgpa in sorted_d.items(): print(f"{roll}: {cgpa}")
关键修正点说明:
- 修复学号输入问题:给
roll变量添加赋值操作,彻底解决未定义变量的报错 - CGPA类型转换:把输入的CGPA转成
float类型,确保排序时是按数值大小比较,而非字符串字典序 - 正确使用
sorted()函数:- 用
key=lambda kv: kv[1]指定按字典的值(CGPA)排序 - 添加
reverse=True实现降序排列,完全匹配你期望的输出顺序
- 用
- 兼容大小写输入:用
repeat.lower() == 'no'处理用户输入的大小写,比如用户输入"No"或"NO"都能正确结束循环
输入示例与输出:
输入流程:
Insert roll: 1
Insert Your cgpa: 3
Want To add more? :yes
Insert roll: 2
Insert Your cgpa: 4.5
Want To add more? :yes
Insert roll: 3
Insert Your cgpa: 4
Want To add more? :yes
Insert roll: 4
Insert Your cgpa: 4.2
Want To add more? :no
输出结果:
排序后的学生成绩:
2: 4.5
4: 4.2
3: 4
1: 3
内容的提问来源于stack exchange,提问作者shawon shamim
相关产品推荐
相关产品推荐

