Python排序函数全面指南:从基础到高级

news2025/5/25 3:43:15

文章目录

  • Python排序函数全面指南:从基础到高级
    • 1. 两种主要排序方式
    • 2. 基本参数详解
      • 2.1 key参数:自定义排序规则
      • 2.2 reverse参数:控制排序方向
    • 3. 高级排序技巧
      • 3.1 多级排序
      • 3.2 稳定排序
    • 4. 性能考虑
    • 5. 特殊排序场景
      • 5.1 对自定义对象排序
      • 5.2 不区分大小写的字符串排序
    • 6. 排序函数对比表
    • 7. 实用技巧总结

Python排序函数全面指南:从基础到高级

排序是编程中最常用的操作之一,Python提供了多种排序方法。本文将全面介绍Python中的排序函数,包括内置函数sorted()和列表方法sort(),以及它们的关键属性和方法。

1. 两种主要排序方式

Python中有两种主要的排序方法:

方法类型返回值原列表是否改变
sorted()内置函数新排序列表不改变原列表
list.sort()列表方法None改变原列表
# sorted() 示例
numbers = [3, 1, 4, 1, 5, 9, 2]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # [1, 1, 2, 3, 4, 5, 9]
print(numbers)         # [3, 1, 4, 1, 5, 9, 2] (原列表未改变)

# sort() 示例
numbers = [3, 1, 4, 1, 5, 9, 2]
numbers.sort()
print(numbers)  # [1, 1, 2, 3, 4, 5, 9] (原列表已改变)

2. 基本参数详解

2.1 key参数:自定义排序规则

key参数允许你指定一个函数,该函数将应用于每个元素,然后根据函数返回的结果进行排序。

# 按字符串长度排序
words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=len)
print(sorted_words)  # ['date', 'apple', 'banana', 'cherry']

# 按元组的第二个元素排序
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
sorted_pairs = sorted(pairs, key=lambda x: x[1])
print(sorted_pairs)  # [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

2.2 reverse参数:控制排序方向

reverse参数是一个布尔值,决定排序是升序(False)还是降序(True)。

numbers = [3, 1, 4, 1, 5, 9, 2]

# 升序排序(默认)
print(sorted(numbers))          # [1, 1, 2, 3, 4, 5, 9]

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

3. 高级排序技巧

3.1 多级排序

通过返回元组作为key函数的返回值,可以实现多级排序。

students = [
    {'name': 'Alice', 'grade': 'A', 'age': 20},
    {'name': 'Bob', 'grade': 'B', 'age': 19},
    {'name': 'Charlie', 'grade': 'A', 'age': 21},
    {'name': 'David', 'grade': 'B', 'age': 20}
]

# 先按grade升序,再按age降序
sorted_students = sorted(students, key=lambda x: (x['grade'], -x['age']))
for student in sorted_students:
    print(student)

3.2 稳定排序

Python的排序是稳定的,这意味着当多个元素具有相同的key时,它们会保持原来的相对顺序。

data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
# 按元组的第二个元素排序
sorted_data = sorted(data, key=lambda x: x[1])
print(sorted_data)
# 输出: [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
# 注意 ('red', 1) 和 ('blue', 1) 保持了原来的顺序

4. 性能考虑

Python使用的排序算法是Timsort,它具有以下特点:

  • 最坏情况时间复杂度:O(n log n)
  • 最好情况时间复杂度:O(n) (当数据已经部分有序时)
  • 空间复杂度:O(n)
import random
import time

# 生成一个大列表
big_list = [random.randint(0, 100000) for _ in range(1000000)]

# 测量排序时间
start = time.time()
sorted_list = sorted(big_list)
end = time.time()
print(f"排序100万个元素耗时: {end - start:.2f}秒")

5. 特殊排序场景

5.1 对自定义对象排序

可以通过定义__lt__方法或使用key参数对自定义对象排序。

class Student:
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade
    
    def __repr__(self):
        return f"{self.name}: {self.grade}"
    
    # 定义小于方法,用于比较
    def __lt__(self, other):
        return self.grade < other.grade

students = [
    Student('Alice', 'A'),
    Student('Bob', 'C'),
    Student('Charlie', 'B')
]

print(sorted(students))  # 自动使用__lt__方法比较

5.2 不区分大小写的字符串排序

fruits = ['apple', 'Banana', 'cherry', 'Date']
print(sorted(fruits))  # ['Banana', 'Date', 'apple', 'cherry'] (默认区分大小写)
print(sorted(fruits, key=lambda x: x.lower()))  # ['apple', 'Banana', 'cherry', 'Date']

6. 排序函数对比表

特性sorted()list.sort()
适用对象任何可迭代对象仅列表
返回值新排序列表None
原列表改变不改变改变
内存使用更多(创建新列表)较少(原地排序)
使用场景需要保留原列表时不需要原列表时

7. 实用技巧总结

  1. 简单升序排序:直接使用sorted()sort()

    sorted([5, 2, 3, 1, 4])  # [1, 2, 3, 4, 5]
    
  2. 降序排序:添加reverse=True

    sorted([5, 2, 3, 1, 4], reverse=True)  # [5, 4, 3, 2, 1]
    
  3. 复杂对象排序:使用key参数

    sorted(['apple', 'banana', 'cherry'], key=len)  # 按长度排序
    
  4. 多条件排序:返回元组作为key

    sorted(students, key=lambda x: (x['grade'], x['age']))
    
  5. 原地排序:当不需要保留原列表时使用sort()

    lst = [5, 2, 3, 1, 4]
    lst.sort()  # lst现在是[1, 2, 3, 4, 5]
    

掌握这些排序技巧将大大提高你在Python中处理数据的效率和灵活性。记住选择哪种排序方法取决于你的具体需求:是否需要保留原列表,以及排序对象的类型。

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

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

相关文章

深入了解redis的哈希槽的知识

目录 1、哈希算法分类 1.1、简单哈希算法 1.2、一致性哈希算法 1、原理&#xff1a; 2、解决问题 3、数据倾斜问题 4、虚拟节点 2. 哈希槽 2.1、介绍 2. 2、作用 1、数据分片&#xff08;Sharding&#xff09; 2、高可用性&#xff08;HA&#xff09; 3…

农业机械化、电气化和自动化知网英文普刊:1天录用,2周见刊发表!

CSP科学出版社&#xff0c;旨在通过为研究人员提供最佳环境来发表、参考、阅读和引用他们的作品&#xff0c;从而为科学界服务。现已与科检易学术达成出版战略合作&#xff0c;现在联合共同出版高质量学术水平的期刊&#xff0c;为方便广大科研学者投稿方便&#xff0c;现已经建…

Docker-Compose使用自定义网桥后在OpenWrt系统中容器无法访问网络解决方案

Docker-Compose使用自定义bridge网桥后在OpenWrt系统中容器无法访问网络解决方案 示例compose描述文件如下&#xff0c;注意最后网络配置&#xff1a; # docker-compose --env-file .env.yoko.prod.local up -d services:...postgres:image: kuluseky/postgres-zhparser-post…

界面组件DevExpress WPF中文教程:Grid - 行和卡片

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

Qt enabled + geometry 属性(2)

文章目录 enabled属性可用与禁用的概念API接口代码演示 阐述说明1. 先简单描述下要如何演示出上面两个接口的效果&#xff08;思路&#xff09;2. 事先规范按钮对象的命名3. 定义两个按钮对象的槽函数 动图演示效果4. widget.cpp geometry属性预备知识API接口上下左右移动 ta…

Llamaindex自学笔记(完)

Llamaindex框架主要做RAG&#xff0c;工作流用LangGraph做 换源&#xff1a; -i https://pypi.mirrors.ustc.edu.cn/simple/环境搭建&#xff1a; conda create -n llamaindex python3.12 conda activate llamaindexpip install llama-index pip install llama-cloud-servic…

飞书知识问答深度测评:企业AI应用落地的“范本级”产品

前言 当 AI 逐渐从技术前沿走向日常办公&#xff0c;我们最常听到的一个词是“效率提升”。但真正能做到降本增效、让企业员工切实受益的 AI 产品&#xff0c;仍属少数。尤其是在组织内部知识管理这一块&#xff0c;大多数企业仍停留在“搜索靠关键词、记录靠记忆、协作靠问人…

draw.io的基础与进阶使用指南

前言 一、Draw.io 简介 Draw.io 是一款功能强大的绘图工具&#xff0c;支持在线使用和本地安装。它提供了丰富的模板和形状元素&#xff0c;能够绘制流程图、UML 图、甘特图、网络图等多种图形。Draw.io 的文件格式支持可编辑的矢量图和位图&#xff0c;方便后续修改 draw.io的…

Sanitizers

一、简介 sanitizers 是谷歌提供的一套开源工具&#xff0c;能够发现堆栈读写溢出、内存泄漏、线程数据竞争和死锁等问题。包括&#xff1a; AddressSanitizers (Asan):检测地址相关问题&#xff0c;如use-after-free,heap-buffer-overflow, stack_buffer_overflow,use_after_…

pip代理出现问题 ProxyError

WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ‘ProxyError(‘Cannot connect to proxy.’, NewConnectionError(’<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f8347ad5ae0>: F…

vue+threeJS 创建镂空球体(SphereGeometry)

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“vuethreeJS 创建镂空球体&#xff08;SphereGeometry&#xff09;”。 上次看到一个做镂空球体的项目&#xff0c;自己也准备尝试着做一做。今天终于做完了&#xff0c;并对这个项目进行梳理。 镂空球体示例效果…

[ Qt ] | 常见控件(一)

目录 Widget enable geometry 标题中的&#xff1a;有一不一定有二&#xff0c;但是有一说明还没结束。 Widget 控件(Widget)&#xff0c;是界面上各种元素&#xff0c;各种部分的统称。 Qt中的控件都是继承自QWidget这个类&#xff0c;是Qt控件体系中&#xff0c;通用的…

【八股战神篇】Java虚拟机(JVM)高频面试题

目录 专栏简介 一 请解释Java虚拟机(JVM)及其主要功能 延伸 1. JVM的基本概念 2. JVM的主要功能 二 对象创建的过程了解吗 延伸 1.Java 创建对象的四种常见方式 三 什么是双亲委派模型 延伸 1.双亲委派机制的作用: 2.双亲委派模型的核心思想: 3.双亲委派模型的…

NDVI谐波拟合(基于GEE实现)

在遥感影像中&#xff0c;我们常用 NDVI&#xff08;归一化植被指数&#xff09;来衡量地表植被的绿度。它简单直观&#xff0c;是生态监测、农情分析的基础工具。但你是否注意到&#xff1a; NDVI 虽然“绿”&#xff0c;却常常“乱”。 因为云层、观测频率、天气干扰&#xf…

南京邮电大学《智能控制技术》期末抢救(上)

一、智能控制的提出 传统控制方法包括经典控制和现代控制——基于被控对象精确模型的控制方式&#xff0c;缺乏灵活性和应变能力&#xff0c;适于解决线性、时不变性等相对简单的控制问题。传统控制方法在实际应用中遇到很多难解决的问题&#xff0c;主要表现以下几点&#xff…

TPDS-2014《Efficient $k$-means++ Approximation with MapReduce》

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…

地理特征类可视化图像

目录 一、蜂窝热力地图 1. 特点 (1)优点 (2)缺点 2. 应用场景 3.python代码实现 (1)代码 (2)实现结果 二、变形地图 1. 特点 (1)优点 (2)缺点 2. 应用场景 3.python代码实现 (1)代码 (2)实现结果 三、关联地图 1. 特点 (1)优点 (2)缺点 2. 应用场景 3.pyth…

【Java高阶面经:微服务篇】8.高可用全链路治理:第三方接口不稳定的全场景解决方案

一、第三方接口治理的核心挑战与架构设计 1.1 不稳定接口的典型特征 维度表现影响范围响应时间P99超过2秒,波动幅度大(如100ms~5s)导致前端超时,用户体验恶化错误率随机返回5xx/429,日均故障3次以上核心业务流程中断,交易失败率上升协议不一致多版本API共存,字段定义不…

DataGridView中拖放带有图片的Excel,实现数据批量导入

1、带有DataGridView的窗体&#xff0c;界面如下 2、编写DataGridView支持拖放的代码 Private Sub DataGridView1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragEnterIf e.Data.GetDataPresent(DataFormats.FileDrop) ThenDim file…

跨域_Cross-origin resource sharing

同源是指"协议域名端口"三者相同&#xff0c;即便两个不同的域名指向同一个ip,也非同源 1.什么是CORS? CORS是一个W3C标准&#xff0c;全称是"跨域资源共享"&#xff08;Cross-origin resource sharing&#xff09;。它允许浏览器向跨源服务器&#xff…