张晨旺 发表于 2020-12-3 11:07:09

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)

在输入完按语文或者数学排序后,程序直接报错。不能运行。
请大家帮忙看看,谢谢

昨非 发表于 2020-12-3 11:15:12

检查一下你的数据从文件读取到列表再存到字典里的过程
是不是有问题,存成了字符串
找不到就中途print一下,再测试

suchocolate 发表于 2020-12-3 11:42:39

本帖最后由 suchocolate 于 2020-12-3 12:16 编辑

定义的函数名最好改成别的,它和list的方法sort重名了,虽然不干扰,但不推荐定义的函数和用到的方法重名,容易引起歧义。
stu_new.sort(key=lambda x:x['chinese']+x['math']+x['english'],reverse=flag)

张晨旺 发表于 2020-12-3 11:46:05

suchocolate 发表于 2020-12-3 11:42


感谢,粗心大意了。用的flag。写的choose。谢谢

张晨旺 发表于 2020-12-3 12:00:34

suchocolate 发表于 2020-12-3 11:42
你定义的函数名最好改改,和list的sort重名了,不符合PEP8规范,我刚刚看还以为你要定义类。

谢谢。还是初学者,都不知道这个规范的问题。我会去自己看看的

suchocolate 发表于 2020-12-3 12:18:11

张晨旺 发表于 2020-12-3 12:00
谢谢。还是初学者,都不知道这个规范的问题。我会去自己看看的

纠正一下,查了下PEP8,没有规定重名的问题。
不过个人建议自定义函数和用到的原生方法重名,容易看错。

阿Rui 发表于 2020-12-3 17:04:51

{:10_269:}{:10_257:}{:10_257:}{:10_257:}{:10_257:}
页: [1]
查看完整版本: python 学生信息排序输出