彻底理解Python相关的排序方法

左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。

公众号:一点sir,关注领取python编程资料

在Python中,列表排序是一项基础而重要的任务,它允许你对一系列元素进行有序排列。Python提供了多种内置方法来实现列表的排序,这些方法既适用于简单的数据类型,也适用于复杂的对象结构。

使用 sort() 方法

sort() 是列表对象的一个方法,它对列表内的元素进行原地排序,这意味着原始列表会直接被修改。

numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort()  # 列表原地排序
print(numbers)  # 输出: [1, 1, 2, 3, 4, 5, 6, 9]

列表 numbers 包含了多个整数。调用 sort() 方法后,列表中的元素按照升序排列。注意,排序是原地进行的,所以 numbers 列表本身被修改了。

sort() 方法使用一种称为蒂姆排序(Timsort)的算法,它是对二叉树排序(一种自适应排序)和插入排序的优化。蒂姆排序的平均和最坏情况时间复杂度都是O(nlogn),其中n是列表的长度。

优点
原地排序,不需要额外的内存分配。
对于部分排序的列表或具有一定顺序的列表,蒂姆排序非常高效。

缺点
如果列表已经排序或接近排序状态,使用 sort() 方法会比 sorted() 多消耗一些内存。

使用 sorted() 函数

sorted() 是一个内置函数,它可以对任何可迭代对象进行排序,并返回一个新的排序后的列表,原始的可迭代对象不会被修改。

示例:

numbers = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_numbers = sorted(numbers)  # 返回一个新的排序列表
print(sorted_numbers)  # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
print(numbers)  # 原始列表不变: [3, 1, 4, 1, 5, 9, 2, 6]

numbers 列表被用作输入,但 sorted() 函数返回了一个新的列表 sorted_numbers,原始的 numbers 列表保持不变。

sorted() 函数同样使用蒂姆排序算法,因此它的时间复杂度也是O(nlogn)。然而,由于它返回一个新的列表,所以需要额外的内存空间。

优点
保持原始列表不变。
对于需要排序结果并保留原始数据的情况非常适用。

缺点
需要额外的内存来存储新列表。

使用 key 参数进行排序

sort()sorted() 都接受一个 key 参数,该参数允许你提供一个函数,用于从可迭代对象的每个元素中提取一个用于排序比较的值。

示例:

class Student:def __init__(self, name, grade):self.name = nameself.grade = gradedef __repr__(self):return f"{self.name} - {self.grade}"students = [Student("John", "A"),Student("Jane", "B"),Student("Jim", "A")
]sorted_students = sorted(students, key=lambda x: x.grade)
print(sorted_students)
# 输出: [Jane - B, Jim - A, John - A]

在这个示例中,我们有一个 Student 类,它有两个属性:namegrade。使用 sorted() 函数并通过 key 参数传递一个 lambda 函数,我们可以根据学生的 grade 对象进行排序。结果列表 sorted_students 首先按照成绩排序,同名的成绩则按照原始顺序排列。

使用 key 参数不会改变排序算法的时间复杂度,它仍然是O(nlogn)。但是,使用 key 可能会增加一些计算开销,因为需要对每个元素应用 key 函数。

优点
提供了根据对象的某个属性进行排序的灵活性。

缺点
对于每个元素的 key 函数调用会增加额外的计算。

使用 reverse 参数进行降序排序

sort()sorted() 方法都接受一个 reverse 参数,当我们设置 reverse=True 时,排序将按照降序进行。

numbers = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_numbers_desc = sorted(numbers, reverse=True)  # 降序排序
print(sorted_numbers_desc)  # 输出: [9, 6, 5, 4, 3, 2, 1, 1]

我们使用 sorted() 函数并设置 reverse=True,这使得排序结果按照降序排列。生成的列表 sorted_numbers_desc 包含了从大到小排列的数字。

是的,Python的operator模块可以用于列表排序,尤其是在你需要根据对象的某个属性或者基于函数返回值进行复杂排序时。operator模块提供了一个名为itemgetter的函数,它可以用来获取对象的特定项,通常与sorted()函数一起使用进行排序。

使用operator.itemgetter进行排序

operator.itemgetter是一个函数,它返回一个函数,这个返回的函数接受一个可迭代对象并返回你请求的那个项。这在排序列表中的复杂对象时非常有用。

比如说假设你有一个学生列表,每个学生都有多个属性,你想要基于学生的某个特定属性(如年龄或成绩)进行排序。

from operator import itemgetterclass Student:def __init__(self, name, age, grade):self.name = nameself.age = ageself.grade = gradedef __repr__(self):return f"{self.name}: {self.age}, {self.grade}"# 创建一个学生列表
students = [Student("John", 20, "A"),Student("Jane", 18, "B"),Student("Jim", 19, "B+"),
]# 使用 itemgetter 按年龄排序
students_sorted_by_age = sorted(students, key=itemgetter(age))
print(students_sorted_by_age)# 使用 itemgetter 按成绩排序
students_sorted_by_grade = sorted(students, key=itemgetter(grade))
print(students_sorted_by_grade)

对于上面的例子,我们首先定义了一个Student类,然后创建了一个学生列表。我们使用operator.itemgetter来创建一个用于获取学生年龄和成绩的函数,并将其作为sorted()函数的key参数。这样,我们就可以根据学生的年龄或成绩对列表进行排序。

使用operator.itemgetter进行排序的性能通常与内置的sorted()函数相当,因为排序算法(蒂姆排序)和时间复杂度(O(nlogn))是相同的。主要的性能开销来自于为每个列表项调用itemgetter函数以获取相应的属性值。

注意事项

当你使用itemgetter对对象列表进行排序时,记住列表中的所有对象必须具有用于排序的相同属性。
如果你只是对内置数据类型(如整数、字符串等)的列表进行排序,通常不需要使用operator模块,直接使用sorted()函数就足够了。

排序总结

在大多数情况下,Python的内置排序方法提供了良好的性能,sort()sorted()足够可以应付大多数情况,其他的排序算法大概的了解就可以了。具体怎么使用就可你自己的实际情况了,当然如果你高兴,自己写排序方法也可以,什么冒泡排序,快速排序,堆排序等等,看你高兴吧,先说这么多吧,拜拜!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS 疑难杂症】无法展开和读取xls、xlsx文件

xls、xlsx文件在ArcGIS中经常用来链接属性。 但是无论ArcMap还是ArcPro,打开xls、xlsx文件时候可能会出现报错。 比如,ArcMap可以打开xls,但是打开xlsx时会出现下面的报错。 而ArcPro就更逊了,xls、xlsx两种都打不开。 以上是小…

网工内推 | 网络工程师,CCIE认证优先,最高10k*13薪

01 广东丰德科技有限公司 招聘岗位:网络工程师 职责描述: 1、负责运营商机房的网络设备的运行维护、故障应急处理; 2、负责各类型网络设备或网络相关的故障的故障分析及诊断; 3、独立完成网络项目的方案设计编写并负责方案的验证…

【后端】python数组去重和过滤的使用方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数组介绍二、python数组去重和过滤1.数组去重2.数组过滤 三、总结 前言 随着开发语言及人工智能工具的普及,使得越来越多的人会主动学习使用一…

python数字大小写转换程序

目录 一.前言 二.完整代码 三.分析 一.前言 大小写数字又称大小写计数词,是一种用于书写数字的表示方式,它区别于阿拉伯数字。大小写数字主要用于正式文件、日期、节日和一些传统的文化表达中。 二.完整代码 info=[零,一,二,三,四,五,六,七,八,九] data=input("请…

STM32用HAL库函数实现硬件IIC

/*出处:【STM32入门教程-2024】第12集 IIC通信与温湿度传感器AHT20(DHT20)_哔哩哔哩_bilibili */ AHT20驱动 这篇笔记我主要介绍代码实现,想要了解原理的请自己看视频,我不过多赘述了。 AHT20通信数据帧格式: ①对照手册上的通…

IFM420-WRDUWZ电动机保护器EOCR-iFM420窗孔0.5-80A

韩国三和,EOCR,SAMWHA,Schneider,施耐德,电机保护器,电动机保护器,电子式电动机保护继电器,电子式过电流继电器,电子式欠电流继电器,电子式电压继电器&#x…

探索大数据混合分层架构:构建智能数据管理平台

随着大数据技术的发展和应用场景的不断拓展,传统的单一数据处理架构已经不能满足复杂多变的业务需求。在这样的背景下,大数据混合分层架构应运而生,成为了构建智能数据管理平台的关键。本文将深入探讨大数据混合分层架构的设计原则、核心组件…

90天玩转Python—19—Python面向对象编程:类与对象的详细介绍和实例

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

JS事件循环、宏任务与微任务

在JavaScript中,事件循环(Event Loop)是处理异步操作的核心机制。它负责执行代码,处理事件,并在适当的时候调度回调。为了更好地理解JavaScript的执行模型,我们需要深入探讨事件循环、宏任务(Ma…

【信息系统项目管理师知识点速记】范围管理:收集需求

9.4 收集需求 收集需求是为实现目标而确定、记录并管理干系人的需要和需求的过程。本过程的主要作用是为定义产品范围和项目范围奠定基础。本过程仅开展一次或仅在项目的预定义点开展。 9.4.1 输入 立项管理文件 商业论证产生的文件,描述了为满足业务需要而应该达到的必要、期…

从文本框限制字符输入,理解代码抽象过程(四次抽象到简单工厂到反射)

这里写目录标题 背景原因抽象过程第一次抽象第二次抽象第三次抽象第四次抽象简单工厂反射 背景 学生信息管理系统中有很多文本框的校验,其中有一点,就是不允许输入过长的信息。 原因 1、文本框校验限制输入长度确保用户内容不超出系统或数据库容量限制…

基于SpringBoot+Vue高校宣讲会管理系统设计与实现

项目介绍: 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装高校宣讲会管理系统软件来发挥其高效地信息…

2024五一劳动节活动策划方案

2024五一劳动节朋克国风养生局(回春集主题)活动策划方案-48P 方案页码:48页 文件格式:pptx 方案简介: 大健康线下活动屡屡出圈 近年来,随着健康意识和生活水平的提升 人们对于自身健康越发关注&#…

面试题:分布式消息中间件 MQ

MQ官网文档: RabbitMQ:https://www.rabbitmq.com/docs RocketMQ:https://rocketmq.apache.org/zh/docs/ Kafka:https://kafka.apache.org/documentation/ DDMQ:https://base.xiaojukeji.com/docs/ddmq 面试题&#xff…

【4103】基于小程序实现的老年人健康管理平台

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

CIA组织MikroTik软路由攻击场景复现及后门加解密剖析

概述 写文章还是有一段时间了,发布的文章也是获得了不少小伙伴的关注,同时也和圈子里面的小伙伴慢慢的建立起了联系,平时也会时不时的一起探讨一些技术问题。因此,在最近和小伙伴的交流学习过程中,有一个小伙伴提到了…

Java:SpringBoot如何优化启动速度

一、yml中设置懒加载 spring:main:lazy-initialization: true 二、SpringBoot启动类中添加注解 Indexed (Spring5才有该注解) Indexed EnableAsync RestController SpringBootApplication(exclude {WxMaAutoConfiguration.class}) EnableTransactionM…

卫星通信现状与展望一 -- 华为Mate60手机+电信中通卫星

某天和一位朋友闲聊的时候,说起了卫星通信这个话题,讨论了卫星应用于个人通信的现状和展望,于是搜集了已有材料,整理如下: 中国天通卫星通信系统 1. 基本情况: 2023年9月消息,华为Mate 60 Pro上市,持有者即使在没有地面信号的情况下,也可以拨打、接听卫星电话。为用户…

面试:MYSQL(SQL优化、MYSQL事务)

目录 一、SQL优化 1、如何定位慢查询 (1)方案一:开源工具 (2)方案二:慢日志查询 2、定位到慢查询时,如何优化 3、什么是索引 (1)底层结构 4、聚簇索引&#xff0…

优秀博士学位论文分享:动态三维场景理解与重建

优秀博士学位论文代表了各学科领域博士研究生研究成果的最高水平,本公众号近期将推出“优秀博士学位论文分享”系列文章,对人工智能领域2023年优秀博士学位论文进行介绍和分享,方便广大读者了解人工智能领域最前沿的研究进展。 “博士学位论…