Python 对列表进行排序的 5 种方法

        在 Python 中,排序是一个非常常见且重要的操作,尤其是对列表的排序。Python 提供了多种方法来实现排序操作,从内置函数到自定义排序逻辑,都可以方便地满足不同的需求。以下将介绍 Python 对列表进行排序的 5 种方法,并配以示例代码。


方法 1:使用 sort() 方法(原地排序)

list.sort() 是列表的一个内置方法,它会直接对列表本身进行排序(即原地排序,不会返回新的列表)。它支持两种可选参数:

  • key:指定排序的依据(通常是一个函数)。
  • reverse:是否降序,默认值为 False
特点
  • 修改原列表,无返回值。
  • 效率高,适合处理较大的列表。
示例代码
 
# 示例 1:默认升序排序
nums = [5, 2, 9, 1, 5, 6]
nums.sort()  # 原地排序
print(nums)  # 输出:[1, 2, 5, 5, 6, 9]# 示例 2:降序排序
nums = [5, 2, 9, 1, 5, 6]
nums.sort(reverse=True)
print(nums)  # 输出:[9, 6, 5, 5, 2, 1]# 示例 3:基于字符串长度排序
words = ["apple", "banana", "kiwi", "cherry"]
words.sort(key=len)
print(words)  # 输出:['kiwi', 'apple', 'cherry', 'banana']

方法 2:使用 sorted() 函数(返回新列表)

sorted() 是一个内置函数,用于对可迭代对象进行排序。与 sort() 不同,sorted() 不会修改原列表,而是返回一个新的排序后的列表。

特点
  • 不改变原列表,返回新列表。
  • 适合需要保留原列表的场景。
示例代码
 
# 示例 1:默认升序排序
nums = [5, 2, 9, 1, 5, 6]
sorted_nums = sorted(nums)
print(sorted_nums)  # 输出:[1, 2, 5, 5, 6, 9]
print(nums)         # 原列表不变,输出:[5, 2, 9, 1, 5, 6]# 示例 2:降序排序
nums = [5, 2, 9, 1, 5, 6]
sorted_nums = sorted(nums, reverse=True)
print(sorted_nums)  # 输出:[9, 6, 5, 5, 2, 1]# 示例 3:基于自定义规则排序
words = ["apple", "banana", "kiwi", "cherry"]
sorted_words = sorted(words, key=len)
print(sorted_words)  # 输出:['kiwi', 'apple', 'cherry', 'banana']

方法 3:使用 lambda 表达式进行自定义排序

无论是 sort() 还是 sorted(),都可以通过 key 参数指定排序依据。这里常使用 lambda 表达式来定义自定义排序规则。

特点
  • 灵活性高,可根据具体需要定义排序规则。
  • 常用于复杂的排序场景。
示例代码
 
# 基于元组的第二个元素排序
data = [(1, 3), (4, 1), (2, 2), (3, 4)]
data.sort(key=lambda x: x[1])  # 按元组的第二个元素排序
print(data)  # 输出:[(4, 1), (2, 2), (1, 3), (3, 4)]# 按字符串的最后一个字母排序
words = ["apple", "banana", "kiwi", "cherry"]
sorted_words = sorted(words, key=lambda x: x[-1])  # 按单词最后一个字母排序
print(sorted_words)  # 输出:['banana', 'apple', 'cherry', 'kiwi']

方法 4:使用 reverse() 方法倒序排列

reverse() 是列表的一个内置方法,用于将列表中的元素顺序颠倒。需要注意,它不是真正的排序,而是直接将当前顺序反转。

特点
  • 修改原列表,直接反转列表顺序。
  • 更适合已经排好序的列表。
示例代码
 
# 示例:将列表倒序排列
nums = [1, 2, 3, 4, 5]
nums.reverse()
print(nums)  # 输出:[5, 4, 3, 2, 1]

方法 5:自定义排序算法

当内置的 sort()sorted() 无法满足需求时,可以实现自己的排序算法(如冒泡排序、快速排序等)。以下以 冒泡排序 为例。

特点
  • 更适合学习和理解排序算法的实现原理。
  • 实际开发中,推荐使用内置排序方法,效率更高。
示例代码:冒泡排序
 
def bubble_sort(nums):n = len(nums)for i in range(n):for j in range(0, n-i-1):if nums[j] > nums[j+1]:  # 比较相邻的元素nums[j], nums[j+1] = nums[j+1], nums[j]  # 交换位置# 测试代码
nums = [5, 2, 9, 1, 5, 6]
bubble_sort(nums)
print(nums)  # 输出:[1, 2, 5, 5, 6, 9]

总结与对比

方法适用场景是否修改原列表灵活性性能表现
sort()原地排序,不需要保存原列表较高快速(Timsort 算法)
sorted()保留原列表,生成新排序列表较高快速(Timsort 算法)
lambda 自定义排序需要复杂规则排序的场景可选非常高依赖于 sort() 或 sorted()
reverse()简单倒序排列一般快速
自定义排序算法学习排序原理或特殊场景可选非常高根据实现算法而定

最佳实践建议

  1. 使用内置方法sort() 和 sorted() 是排序的首选方法,性能高且易用,适合大多数场景。
  2. 自定义排序规则:通过 key 参数和 lambda 表达式可以轻松实现复杂排序逻辑。
  3. 特殊场景使用自定义算法:在了解排序算法原理或处理特殊需求时,可以自己实现排序算法,但性能可能不如内置方法。

通过以上 5 种方法,你可以轻松地对列表进行排序,满足各种实际需求!

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

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

相关文章

2025年1月26日(超声波模块:上拉或下拉电阻)

添加上拉或下拉电阻是在电子电路设计和嵌入式系统编程中常用的一种技术手段,下面为你详细解释其含义、作用和应用场景。 基本概念 在数字电路里,引脚的电平状态通常有高电平(逻辑 1)和低电平(逻辑 0)两种…

项目概述与规划 (I)

项目概述与规划 (I) JavaScript的学习已经接近尾声了,最后我们将通过一个项目来讲我们在JavaScript中学习到的所有都在这个项目中展现出来,这个项目的DEMO来自于Udemy中的课程,作者是Jonas Schmedtmann; 项目规划 项目步骤 用户…

深入探讨Web应用开发:从前端到后端的全栈实践

目录 引言 1. Web应用开发的基本架构 2. 前端开发技术 HTML、CSS 和 JavaScript 前端框架与库 响应式设计与移动优先 3. 后端开发技术 Node.js(JavaScript后端) Python(Flask和Django) Ruby on Rails Java(S…

docker如何查看容器启动命令(已运行的容器)

docker ps 查看正在运行的容器 该命令主要是为了详细展示查看运行时的command参数 # 通过docker --no-trunc参数来详细展示容器运行命令 docker ps -a --no-trunc | grep <container_name>通过docker inspect命令 使用docker inspect&#xff0c;但是docker inspect打…

为AI聊天工具添加一个知识系统 之62 详细设计 之3:AI操作系统 之1

本文要点 要点 考虑下面的一组整理&#xff08;重点看一下用词、分组分行分类以及 排列组合&#xff09;&#xff0c;看看应该如何将他们组织到本项目程序中&#xff0c;是否同时还丰富了前面讨论的AI操作系统和Lexicographer 程序的内容。 1、工作任务&#xff1a;运行时编译…

项目集成RabbitMQ

文章目录 1.common-rabbitmq-starter1.创建common-rabbitmq-starter2.pom.xml3.自动配置1.RabbitMQAutoConfiguration.java2.spring.factories 2.测试使用1.创建common-rabbitmq-starter-demo2.目录结构3.pom.xml4.application.yml5.TestConfig.java 配置交换机和队列6.TestCon…

LLM大模型推理中的常见数字

1. 聊天机器人Chatbot&#xff0c;一般&#xff0c;input tokens : output tokens 1100:15 2. LLama2的tokenizer&#xff0c;中文情况下&#xff0c;token:汉字1:1.01 3. prefilling阶段的吞吐量(tokens/s)&#xff0c;一般是decoding阶段的50~100倍。 4. 4张带有NVLink的…

【AI日记】25.01.26

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Forecasting Sticker Sales 读书 书名&#xff1a;自由宪章 律己 AI&#xff1a;6 小时作息&#xff1a;00:30-8:30短视频&#xff1a;大于 1 小时读书和写作&a…

RK3568 adb使用

文章目录 一、adb介绍**ADB 主要功能****常用 ADB 命令****如何使用 ADB****总结** 二、Linux下载adb**方法 1&#xff1a;使用包管理器&#xff08;适用于 Ubuntu/Debian 系统&#xff09;****方法 2&#xff1a;通过 Snap 安装&#xff08;适用于支持 Snap 的系统&#xff09…

STM32项目分享:智能宠物喂食系统(升级版)

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; STM32智能宠物喂食系统(升级版) &#xff08;资…

JS 时间格式大全(含大量示例)

在 JS 中&#xff0c;处理时间和日期是常见的需求。无论是展示当前时间、格式化日期字符串&#xff0c;还是进行时间计算&#xff0c;JavaScript 都提供了丰富的 API 来满足这些需求。本文将详细介绍如何使用 JavaScript 生成各种时间格式&#xff0c;从基础到高级&#xff0c;…

软件测试 —— 性能测试(jmeter)

软件测试 —— 性能测试&#xff08;jmeter&#xff09; 什么是jmeter安装jmeterjmeter常用组件线程组取样器结果树 我们之前学习了接口测试工具Postman&#xff0c;我们今天要学习的是性能测试工具——jmeter 什么是jmeter Apache JMeter 是一个开源的性能测试工具&#xff…

element-plus 的table section如何实现单选

如果是单选那么全新的按钮应该隐藏或者不可编辑的状态。但是我没找到改变成不可编辑的方法&#xff0c;只能采取隐藏 <template><!-- 注意要包一层div根元素&#xff0c;否则css样式可能会不生效&#xff0c;原因不详 --><div><el-table ref"proTab…

电阻补偿OTA的噪声分析

上文&#xff08;补偿电阻对ota零极点的影响-CSDN博客&#xff09;分析了补偿电阻对五管OTA零极点的影响&#xff0c;该篇借分析电阻补偿OTA的噪声来串联复习下噪声章节的一些基础概念。 1.噪声分析 辅助定理 开始分析OTA噪声之前&#xff0c;先引入一个辅助定理&#xff08;R…

从CRUD到高级功能:EF Core在.NET Core中全面应用(四)

初识表达式树 表达式树&#xff1a;是一种可以描述代码结构的数据结构&#xff0c;它由一个节点组成&#xff0c;节点表示代码中的操作、方法调用或条件表达式等&#xff0c;它将代码中的表达式转换成一个树形结构&#xff0c;每个节点代表了代码中的操作例如&#xff0c;如果…

C语言初阶力扣刷题——349. 两个数组的交集【难度:简单】

1. 题目描述 力扣在线OJ题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 输入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 输出&#xff1a;[9,4] 2. 思路 直接暴力…

在Qt中实现点击一个界面上的按钮弹窗到另一个界面

文章目录 步骤 1&#xff1a;创建新窗口类步骤 2&#xff1a;设计窗口的 UI步骤 3&#xff1a;设计响应函数 以下是一个完整的示例&#xff0c;展示在Qt中如何实现在一个窗口中通过点击按钮弹出一个新窗口。 步骤 1&#xff1a;创建新窗口类 假设你要创建一个名为 WelcomeWidg…

StarRocks 安装部署

StarRocks 安装部署 StarRocks端口&#xff1a; 官方《配置检查》有服务端口详细描述&#xff1a; https://docs.starrocks.io/zh/docs/deployment/environment_configurations/ StarRocks架构&#xff1a;https://docs.starrocks.io/zh/docs/introduction/Architecture/ Sta…

二叉树的最大深度(力扣104)

所谓二叉树的最大深度其实也是根节点的最大高度&#xff0c;同时也是该二叉树的高度。那么要解决这个问题&#xff0c;我们该选择哪一种遍历方式呢&#xff1f; 要获取最大高度&#xff0c;我们需要比较节点的左右子树的高度&#xff0c;取较大的那个值返回给父节点。通过不断…

dm8在Linux环境安装精简步骤说明(2024年12月更新版dm8)

dm8在Linux环境安装详细步骤 - - 2025年1月之后dm8 环境介绍1 修改操作系统资源限制2 操作系统创建用户3 操作系统配置4 数据库安装5 初始化数据库6 实例参数优化7 登录数据库配置归档与备份8 配置审计9 创建用户10 屏蔽关键字与数据库兼容模式11 jdbc连接串配置12 更多达梦数据…