Python自定义排序详解

简介

如果以创建的对象作为列表中的元素,那么对列表进行排序时可使用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)
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值