如果以创建的对象作为列表中的元素,那么对列表进行排序时可使用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)
标签:20,name,自定义,Python,age,详解,ls,each,self
From: https://www.cnblogs.com/Fare-well/p/16818505.html