Python列表sort()方法排序结果不符合数值预期的原因
问题根因
input() 函数接收的所有输入默认返回字符串(str)类型,你代码里的marks列表存储的全是字符串元素,而非数值类型。
Python对字符串执行sort()排序时,默认按照逐字符比对的字典序规则排序,不会自动将字符串解析为数值比较大小:
- 比对从字符串的第一个字符开始,比较字符对应的ASCII码值,首字符更小的字符串整体排在前面;只有首字符相同时,才会继续比对第二个字符,以此类推。
你得到的异常排序结果['12', '347', '347', '56', '85']完全符合字符串排序逻辑:
'12'首字符是'1',ASCII码最小,排第一位- 两个
'347'首字符是'3',ASCII码小于'5'和'8',所以排在'56'、'85'前面,根本不会触发后续字符的比对,和字符串代表的数值347大小没有关系。
修复方案
接收输入时显式将输入内容转换为数值类型即可,如果成绩为整数就用int()转换,存在小数就用float()转换,修正后的可运行代码如下:
a1 = int(input("enter marks 1 :")) a2 = int(input("enter marks 2 :")) a3 = int(input("enter marks 3 :")) a4 = int(input("enter marks 4 :")) a5 = int(input("enter marks 5 :")) marks = [a1, a2, a3, a4, a5] print(marks) marks.sort() print(marks)
输入和你之前相同的测试值,运行后排序结果为[12, 56, 85, 347, 347],符合数值从小到大的排序预期。
内容的提问来源于stack exchange,提问作者Rajnee Paul
相关产品推荐
相关产品推荐

