Python 排序指南:sorted() 函数详解

排序基础

排序是编程中最常用的算法之一。Python 提供了内置的 sorted() 函数,可以方便地对各种可迭代对象进行排序。

>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]

自定义排序

sorted() 是一个高阶函数,可以接收 key 参数来自定义排序规则:

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

key 函数会应用于每个元素,然后根据返回的结果进行排序。

字符串排序

默认情况下,字符串按 ASCII 码值排序:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']

要忽略大小写排序,可以使用 str.lowerstr.upper 作为 key 函数:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']

反向排序

使用 reverse=True 参数可以实现降序排序:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

复杂对象排序

对于包含元组或字典等复杂对象的列表,可以自定义 key 函数:

students = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

# 按名字排序
def by_name(t):
    return t[0].lower()  # 忽略大小写

sorted_by_name = sorted(students, key=by_name)
print(sorted_by_name)
# 输出: [('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]

# 按成绩降序排序
def by_score(t):
    return -t[1]  # 使用负数实现降序

sorted_by_score = sorted(students, key=by_score)
print(sorted_by_score)
# 输出: [('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]

现代 Python 排序技巧

  1. 使用 lambda 表达式 简化 key 函数:
sorted_by_name = sorted(students, key=lambda x: x[0].lower())
  1. 使用 operator 模块 提高效率:
from operator import itemgetter

# 按名字排序
sorted_by_name = sorted(students, key=itemgetter(0))
# 按成绩排序
sorted_by_score = sorted(students, key=itemgetter(1), reverse=True)
  1. 多级排序
# 先按成绩降序,再按名字升序
sorted_students = sorted(students, key=lambda x: (-x[1], x[0]))

性能考虑

  • 对于大型数据集,key 函数的性能会影响排序速度
  • 如果需要多次排序,可以考虑使用 functools.cmp_to_key 将老式的比较函数转换为 key 函数
  • 对于稳定性要求高的场景,Python 的排序算法是稳定的(相等元素的相对位置不变)

总结

Python 的 sorted() 函数提供了强大的排序功能,通过 keyreverse 参数可以实现各种复杂的排序需求。现代 Python 还提供了更简洁的写法(如 lambda 表达式)和更高效的实现(如 operator 模块),使得排序操作更加灵活高效。