首页 > 编程语言 >7.Python自定义排序详解

7.Python自定义排序详解

时间:2022-10-23 14:33:56浏览次数:77  
标签:20 name 自定义 Python age 详解 ls each self

如果以创建的对象作为列表中的元素,那么对列表进行排序时可使用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

相关文章

  • python装饰器
    省流:直接看最后从简单的例子开始,定义装饰器register,定义一个简单的类method,使用装饰器装饰类defregister(*args,name=None):defwarpper(method_cls):pr......
  • 配置docker 容器自定义ip 网段
    1.打开cat/etc/docker/daemon.json添加 "bip":"192.168.0.1/16",配置如下{"bip":"192.168.0.1/16","data-root":"/data/bkce/public/paas_agent/docker",......
  • Python中的矩阵——NumPy包
    Part1安装NumPy包,以VScode为例:打开VisualStudioCode,选取任一python项目文件,运行该文件,在终端(Terminal)中输入cd+空格+Python安装目录下Scripts文件的路径,例如我......
  • 我决定以后一直使用Eclipse了 因为它也可以安装集成PyDec插件来实现Python开发了 哇哈
    前言​​Python​​​作为当今主流的爬虫编程语言,在我们的开发当中时不时都会使用到一些,那么如果你想再​​Eclipse​​​当中进行一些​​Python​​​的开发就要安装一下......
  • win11系统下python3.10安装face_recognition和dlib
     作者:......
  • 基于vite3+tauri模拟QQ登录切换窗体|Tauri自定义拖拽|最小/大/关闭
    前两天有给大家分享tauri+vue3快速搭建项目、封装桌面端多开窗口。今天继续来分享tauri创建启动窗口、登录窗口切换到主窗口及自定义拖拽区域的一些知识。希望对想要学习或......
  • Python笔记
    @目录前言总结如何搭建虚拟环境main.py文件一定要根目录下面python中类的变量和实例变量的区别pyqt5的按钮点击事件删除线程函数问题使用pyinstaller编译成exe 如果提示 ......
  • Python正则表达式
    1.10Python正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使Python语言拥有全部的正则表达式功能。compile......
  • # yyds干货盘点 # 盘点Python网络爬虫过程中xpath的联合查询定位一个案例
    大家好,我是皮皮。一、前言前几天在Python钻石交流群【髙鵬】问了一个​​Python​​网络爬虫的问题,提问截图如下:原始代码如下:importtimefromseleniumimportwebdriverfro......
  • python虚拟环境搭建
    @目录前言创建激活运行CodeRunner使用虚拟环境在线安装离线安装前言使用Python开发项目免不了要安装各种包。我们安装的所有包都会被安装到同一个目录下,供Python调用。......