当前位置: 首页 > article >正文

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

文章目录

  • 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 = nameself.grade = gradedef __repr__(self):return f"{self.name}: {self.grade}"# 定义小于方法,用于比较def __lt__(self, other):return self.grade < other.gradestudents = [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.lryc.cn/news/2385067.html

相关文章:

  • 深入了解redis的哈希槽的知识
  • 农业机械化、电气化和自动化知网英文普刊:1天录用,2周见刊发表!
  • java将rtsp转成flv在浏览器播放
  • Docker-Compose使用自定义网桥后在OpenWrt系统中容器无法访问网络解决方案
  • 界面组件DevExpress WPF中文教程:Grid - 行和卡片
  • Qt enabled + geometry 属性(2)
  • Llamaindex自学笔记(完)
  • 安全生态与职业跃迁
  • 飞书知识问答深度测评:企业AI应用落地的“范本级”产品
  • draw.io的基础与进阶使用指南
  • clang的介绍与使用
  • GD32 IIC(I2C)通信(使用示例为SD2068)
  • Sanitizers
  • pip代理出现问题 ProxyError
  • Ubuntu-多显示器黑屏问题及nvidia显卡驱动安装
  • vue+threeJS 创建镂空球体(SphereGeometry)
  • [ Qt ] | 常见控件(一)
  • 【八股战神篇】Java虚拟机(JVM)高频面试题
  • Pycharm-jupyternotebook不渲染
  • lanqiaoOJ 4330:欧拉函数模板
  • NDVI谐波拟合(基于GEE实现)
  • 《虚拟即真实:数字人驱动技术在React Native社交中的涅槃》
  • 南京邮电大学《智能控制技术》期末抢救(上)
  • Cookie、Session、JWT
  • TPDS-2014《Efficient $k$-means++ Approximation with MapReduce》
  • 地理特征类可视化图像
  • 【Java高阶面经:微服务篇】8.高可用全链路治理:第三方接口不稳定的全场景解决方案
  • DataGridView中拖放带有图片的Excel,实现数据批量导入
  • 跨域_Cross-origin resource sharing
  • Opencv常见学习链接(待分类补充)