如果以创建的对象作为列表中的元素,那么对列表进行排序时可使用sort()函数或sorted()函数,但要注意的是:
①当排序对象为列表的时候两者适合的场景不同
②sorted()函数会返回一个排序后的列表,原有列表保持不变
③sort()函数会直接修改原有列表,永久改变,无法返回,函数返回为None
④如果实际应用过程中需要保留原有列表,使用sorted()函数较为适合,否则可以选择sort()函数,因为sort()函数不需要复制原有列表,消耗的内存较少,效率也较高

1.利用operator模块和sort()函数根据单个属性进行排序

import operator

class STU:
    def __init__(self, id, name, age):
        self.id = id
        self.name = name
        self.age = age
        
ls = []
n = int(input()) # 输入学生人数
for i in range(n):
    a, b, c = input().split() # 输入学号,姓名,年龄
    ls.append(STU(a, b, c)) # 将当前学生信息加入列表中

ls.sort(key=operator.attrgetter("age")) # 对学生按照年龄属性升序排列,若相同则自动按照输入顺序
for each in ls:
    print(each.id, each.name, each.age)
'''
测试数据
3
01 堃堃 20
03 小黑子 21
02 郭子 20
输出
01 堃堃 20
02 郭子 20
03 小黑子 21
'''

ls.sort(key=operator.attrgetter("age"), reverse=True) # 对学生按照年龄属性降序排列,若相同则自动按照输入顺序
for each in ls:
    print(each.id, each.name, each.age)
'''
测试数据
3
01 堃堃 20
03 小黑子 21
02 郭子 20
输出
03 小黑子 21
01 堃堃 20
02 郭子 20
'''

2.利用sorted()函数和lambda表达式根据单个属性进行排序

class STU:
    def __init__(self, id, name, age, score):
        self.id = id
        self.name = name
        self.age = age
        self.score = score


ls = []
n = int(input())
for i in range(n):
    a, b, c, d = input().split()
    ls.append(STU(a, b, int(c), int(d)))

ls = sorted(ls, key=lambda x: x.score)  # 对学生按照成绩属性升序排列,若相同则自动按照输入顺序
for each in ls:
    print(each.id, each.name, each.age, each.score)
'''
测试数据
3
01 堃堃 20 90
03 小黑子 21 59
02 郭子 20 100
输出
03 小黑子 21 59
01 堃堃 20 90
02 郭子 20 100
'''

ls = sorted(ls, key=lambda x: -x.score)  # 对学生按照成绩属性降序排列,若相同则自动按照输入顺序
for each in ls:
    print(each.id, each.name, each.age, each.score)
'''
测试数据
3
01 堃堃 20 90
03 小黑子 21 59
02 郭子 20 100
输出
02 郭子 20 100
01 堃堃 20 90
03 小黑子 21 59
'''

3.利用sorted()函数和lambda表达式根据多个属性进行排序

class STU:
    def __init__(self, id, name, age, score):
        self.id = id
        self.name = name
        self.age = age
        self.score = score


ls = []
n = int(input())
for i in range(n):
    a, b, c, d = input().split()
    ls.append(STU(a, b, int(c), int(d)))

ls = sorted(ls, key=lambda x: (x.age, x.score))  # 按年龄升序,若年龄相同则按照分数升序
for each in ls:
    print(each.id, each.name, each.age, each.score)
'''
测试数据
3
01 堃堃 20 90
03 小黑子 21 59
02 郭子 20 100
输出
01 堃堃 20 90
02 郭子 20 100
03 小黑子 21 59
'''
ls = sorted(ls, key=lambda x: (x.age, -x.score))  # 按年龄升序,若年龄相同则按照分数降序
for each in ls:
    print(each.id, each.name, each.age, each.score)
'''
测试数据
3
01 堃堃 20 90
03 小黑子 21 59
02 郭子 20 100
输出
02 郭子 20 100
01 堃堃 20 90
03 小黑子 21 59
'''

4.考生排序(实际例题) 链接:https://sunnywhy.com/sfbj/4/1/93

题目描述
给定个考生的姓名、语文分数、数学分数,按下面两种排序要求之一进行排序:
1.按语文分数从高到低排序,分数相同时按姓名字典序从小到大排序
2.按数学分数从高到低排序,分数相同时按姓名字典序从小到大排序
输出排序后的结果。

输入描述
第一行两个整数n和k,分别表示考生个数、排序方式(k=1时表示按第一种方式排序,k=2时表示按第二种方式排序)

接下来n行,每行为一个考生的姓名name、语文分数score1、数学分数score2(为仅由大小写字母组成的不超过15个字符的字符串)用空格隔开。数据确保不会出现相同的姓名。

输出描述
输出排序后的结果,共n行,每行为一个考生的姓名、语文分数、数学分数,用空格隔开。

样例1
输入

5 1
SunWuKong 92 88
ShaWuJing 90 92
TangSanZang 100 100
BaiLongMa 90 88
ZhuBaJie 87 91

输出

TangSanZang 100 100
SunWuKong 92 88
BaiLongMa 90 88
ShaWuJing 90 92
ZhuBaJie 87 91

样例2
输入

5 2
SunWuKong 92 88
ShaWuJing 90 92
TangSanZang 100 100
BaiLongMa 90 88
ZhuBaJie 87 91

输出

TangSanZang 100 100
ShaWuJing 90 92
ZhuBaJie 87 91
BaiLongMa 90 88
SunWuKong 92 88

代码:

class stu:
    def __init__(self, name, chinese, math):
        self.name = name
        self.chinese = chinese
        self.math = math

ls = []
n, k = map(int, input().split())
for i in range(n):
    a, b, c = input().split()
    ls.append(stu(a, int(b), int(c)))
if k == 1:
    ls = sorted(ls, key=lambda x: (-x.chinese, x.name))
elif k == 2:
    ls = sorted(ls, key=lambda x: (-x.math, x.name))
for each in ls:
    print(each.name, each.chinese, each.math)

原文地址:http://www.cnblogs.com/Fare-well/p/16818505.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性