python 学生信息排序输出
求助!我的学生信息文件是这样的。filename=‘student.txt’{'id': 1001, 'name': 'zz', 'chinese': 10, 'math': 10, 'english': 10}
{'id': 1002, 'name': 'xx', 'chinese': 20, 'math': 20, 'english': 20}
{'id': 1003, 'name': 'www', 'chinese': 1, 'math': 2, 'english': 50}
{'id': 100, 'name': '1', 'chinese': 14, 'math': 14, 'english': 45}
def sort():#定义的排序函数
if os.path.exists(filename): #文件如果存在
with open(filename,'r',encoding='utf-8') as rfile:#只读打开
stu_list=rfile.readlines()#读取到stu_list的列表中
stu_new = [] #定义一个新的列表
for i in stu_list: #遍历列表,将每一项转化为字典
d=dict(eval(i))
stu_new.append(d) #成功将字典添加到列表的每一项
else:
print('目前没有学生信息可供排序!')
return
while True:
try:
choose=input('请选择排序方式:升序(1)/降序(2)')#sort 默认升序
if choose=='1':
flag=False
elif choose=='2':
flag=True
else:
print('排序方式输入有误,请重新输入!')
continue
except:
print('输入为空,请重新选择排序方式!')
continue
num=input('按语文成绩排序(1),按数学成绩排序(2),按英语成绩排序(3),按总分排序(4)')
if num == '1':
stu_new.sort(key=lambda x:x['chinese'],reverse=choose)#此处出错。
elif num == '2':
stu_new.sort(key=lambda x:x['math'],reverse=choose)#此处出错。
elif num == '3':
stu_new.sort(key=lambda x:x['english'],reverse=choose)#此处出错。
elif num == '4':
stu_new.sort(key=lambda x:x['chinese']+x['math']+x['english'],reverse=choose)#此处出错。
else:
print('排序关键字输入有误,请重新选择!')
continue
show_student(stu_new)#将排序完的列表展示
错误信息提示:stu_new.sort(key=lambda x:x['chinese']+x['math']+x['english'],reverse=choose)#此处出错。
TypeError: an integer is required (got type str)
在输入完按语文或者数学排序后,程序直接报错。不能运行。
请大家帮忙看看,谢谢
检查一下你的数据从文件读取到列表再存到字典里的过程
是不是有问题,存成了字符串
找不到就中途print一下,再测试 本帖最后由 suchocolate 于 2020-12-3 12:16 编辑
定义的函数名最好改成别的,它和list的方法sort重名了,虽然不干扰,但不推荐定义的函数和用到的方法重名,容易引起歧义。
stu_new.sort(key=lambda x:x['chinese']+x['math']+x['english'],reverse=flag) suchocolate 发表于 2020-12-3 11:42
感谢,粗心大意了。用的flag。写的choose。谢谢 suchocolate 发表于 2020-12-3 11:42
你定义的函数名最好改改,和list的sort重名了,不符合PEP8规范,我刚刚看还以为你要定义类。
谢谢。还是初学者,都不知道这个规范的问题。我会去自己看看的 张晨旺 发表于 2020-12-3 12:00
谢谢。还是初学者,都不知道这个规范的问题。我会去自己看看的
纠正一下,查了下PEP8,没有规定重名的问题。
不过个人建议自定义函数和用到的原生方法重名,容易看错。 {:10_269:}{:10_257:}{:10_257:}{:10_257:}{:10_257:}
页:
[1]