上一篇
Python List排序完全指南:方法与实例详解 | Python排序教程
- Python
- 2025-08-05
- 1325
Python List排序完全指南
掌握sort()方法与sorted()函数的全面使用技巧
Python列表排序基础
Python提供了两种主要的排序方法:
- list.sort() - 原地排序(修改原始列表)
- sorted() - 返回新的排序列表(不修改原始列表)
sort()方法
# 基本用法
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort()
print(numbers) # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
# 降序排序
numbers.sort(reverse=True)
print(numbers) # 输出: [9, 6, 5, 4, 3, 2, 1, 1]
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] (原列表未改变)
# 降序排序
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc) # 输出: [9, 6, 5, 4, 3, 2, 1, 1]
自定义排序规则
使用key
参数可以自定义排序规则:
按字符串长度排序
fruits = ["apple", "banana", "cherry", "date", "elderberry"]
fruits.sort(key=len)
print(fruits) # 输出: ['date', 'apple', 'banana', 'cherry', 'elderberry']
按自定义函数排序
# 按绝对值排序
numbers = [-5, 3, -2, 8, -1]
numbers.sort(key=abs)
print(numbers) # 输出: [-1, -2, 3, -5, 8]
# 按字符串的第二个字符排序
words = ["banana", "apple", "cherry", "date"]
sorted_words = sorted(words, key=lambda x: x[1])
print(sorted_words) # 输出: ['date', 'banana', 'apple', 'cherry']
复杂对象排序
在实际应用中,我们经常需要对包含复杂对象(如字典)的列表进行排序:
字典列表排序
students = [
{"name": "Alice", "age": 20, "grade": 88},
{"name": "Bob", "age": 22, "grade": 92},
{"name": "Charlie", "age": 19, "grade": 85}
]
# 按年龄排序
students_sorted_by_age = sorted(students, key=lambda s: s['age'])
print(students_sorted_by_age)
# 输出: [{'name': 'Charlie', 'age': 19, 'grade': 85},
# {'name': 'Alice', 'age': 20, 'grade': 88},
# {'name': 'Bob', 'age': 22, 'grade': 92}]
# 按成绩降序排序
students.sort(key=lambda s: s['grade'], reverse=True)
print(students)
# 输出: [{'name': 'Bob', 'age': 22, 'grade': 92},
# {'name': 'Alice', 'age': 20, 'grade': 88},
# {'name': 'Charlie', 'age': 19, 'grade': 85}]
多级排序
# 先按成绩降序,再按年龄升序
students = [
{"name": "Alice", "age": 20, "grade": 88},
{"name": "Bob", "age": 22, "grade": 92},
{"name": "Charlie", "age": 19, "grade": 88},
{"name": "David", "age": 21, "grade": 92}
]
students_sorted = sorted(students, key=lambda s: (-s['grade'], s['age']))
for student in students_sorted:
print(f"{student['name']} - Age: {student['age']}, Grade: {student['grade']}")
# 输出:
# Bob - Age: 22, Grade: 92
# David - Age: 21, Grade: 92
# Alice - Age: 20, Grade: 88
# Charlie - Age: 19, Grade: 88
高级排序技巧
使用operator模块
import operator
# 按字典的值排序
students = [
{"name": "Alice", "age": 20, "grade": 88},
{"name": "Bob", "age": 22, "grade": 92},
{"name": "Charlie", "age": 19, "grade": 85}
]
# 按年龄排序
students.sort(key=operator.itemgetter('age'))
print(students)
# 多级排序:先按成绩,再按年龄
students.sort(key=operator.itemgetter('grade', 'age'))
print(students)
自定义排序类
class Product:
def __init__(self, name, price, rating):
self.name = name
self.price = price
self.rating = rating
def __repr__(self):
return f"Product('{self.name}', {self.price}, {self.rating})"
products = [
Product("Laptop", 1200, 4.5),
Product("Phone", 800, 4.2),
Product("Tablet", 600, 4.7),
Product("Monitor", 300, 4.3)
]
# 按价格排序
products.sort(key=lambda p: p.price)
print(products)
# 按评分降序排序
products.sort(key=lambda p: p.rating, reverse=True)
print(products)
排序算法性能与注意事项
重要注意事项
- Python的排序算法是Timsort,一种混合稳定排序算法
- 时间复杂度:平均和最坏情况均为O(n log n)
- sort()方法会改变原始列表,sorted()函数会返回新列表
- 当对包含不同数据类型的列表排序时,Python 3会抛出TypeError异常
- 使用key参数比cmp参数更高效(Python 3已移除cmp参数)
- 对于稳定性要求高的场景,Python排序是稳定的(相等元素的顺序保持不变)
性能优化建议
- 避免在key函数中进行复杂计算
- 对于大型数据集,考虑使用内置排序而非自定义算法
- 如果只需要部分排序结果,可以使用heapq模块
- 对于已部分排序的数据,Timsort表现尤为高效
- 当排序键计算成本高时,考虑使用Schwartzian变换(装饰-排序-去装饰)
Python排序方法总结
sort()方法
- 原地排序(修改原列表)
- 不返回任何值
- 适用于不需要保留原列表的情况
- 语法:list.sort(key=None, reverse=False)
sorted()函数
- 返回新的排序列表
- 原列表保持不变
- 适用于需要保留原列表的情况
- 语法:sorted(iterable, key=None, reverse=False)
本文由FuSha于2025-08-05发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20257391.html
发表评论