Python查找学生数组最低成绩时触发int与str比较TypeError报错
问题说明
编写Python代码实现学生信息(姓名、学号、成绩)录入、平均成绩计算功能时,需要从存储数据的列表中提取最低学生成绩,运行代码时持续抛出Traceback回溯报错,无法得到预期结果。
原实现代码
def my_array(): students = list() total = 0 NumStudents = int(input("Please enter number of students: ")) for i in range(int(NumStudents)): Student_Name = input("Please enter student name: ") students.append(Student_Name) Student_Num = int(input("Please enter student number: ")) students.append(int(Student_Num)) Student_Mark = int(input("Please enter student mark: ")) students.append(int(Student_Mark)) total += Student_Mark listA = students new_list = np.array_split(listA, NumStudents) for item in new_list: print(list(item)) #print(list(item[0])) print('Average Student Mark is', str(total / NumStudents)) def find_min(students): minimum = students[0] for x in students[1:]: if x < minimum: minimum = x return minimum find_min(students) my_array()
运行报错信息
Traceback (most recent call last): File "C:\Users\MMaseko\PycharmProjects\utopiaWasteDisposalPlant\iterable.py", line 37, in <module> my_array() File "C:\Users\MMaseko\PycharmProjects\utopiaWasteDisposalPlant\iterable.py", line 36, in my_array find_min(students) File "C:\Users\MMaseko\PycharmProjects\utopiaWasteDisposalPlant\iterable.py", line 33, in find_min if x < minimum: TypeError: '<' not supported between instances of 'int' and 'str'
错误原因定位
- 数据存储结构错误:将字符串类型的姓名、整数类型的学号、整数类型的成绩全部平铺存入同一个
students列表,列表内同时混存两种类型的数据,遍历做大小比较时会触发类型不支持比较的报错。 - 代码缩进错误:列表拆分、成绩打印、平均分计算、最小值查找的逻辑全部写在了录入学生信息的for循环内部,每录入1个学生就会执行一次全量计算,执行时机完全错误。
- 函数逻辑错误:自定义
find_min函数的return语句写在了if判断块内部,只要遍历到第一个比初始值小的元素就会直接返回,不会遍历完全部元素,即便数据类型正确也无法得到真正的最小值。 - 依赖缺失:代码中调用了
np.array_split方法,但没有提前导入numpy库,即便解决了类型报错,执行到这行也会抛出NameError。 - 筛选逻辑缺失:找最低成绩时直接把混存了姓名、学号、成绩的全量列表传入比较函数,没有单独提取成绩字段做计算。
修正后代码
修正思路:按单个学生维度分组存储信息,单独维护纯成绩的列表用于计算平均分、最低分,调整所有计算、输出逻辑的位置到全部学生信息录入完成后,移除不必要的第三方库依赖,修正最小值函数的返回逻辑。
def find_min(num_list): minimum = num_list[0] for x in num_list[1:]: if x < minimum: minimum = x return minimum def my_array(): students = [] total = 0 mark_list = [] NumStudents = int(input("Please enter number of students: ")) for i in range(NumStudents): Student_Name = input("Please enter student name: ") Student_Num = int(input("Please enter student number: ")) Student_Mark = int(input("Please enter student mark: ")) # 按学生分组存储信息,避免不同类型数据平铺混存 students.append([Student_Name, Student_Num, Student_Mark]) total += Student_Mark mark_list.append(Student_Mark) # 所有信息录入完成后再执行打印、计算逻辑 for item in students: print(item) print('Average Student Mark is', total / NumStudents) min_mark = find_min(mark_list) print('Lowest Student Mark is', min_mark) my_array()
内容的提问来源于stack exchange,提问作者Mduduzi Maseko
相关产品推荐
相关产品推荐

