page contents

Python排序原来这么简单:一文搞懂 sorted、key 和高效排序技巧

Python 的排序设计非常优雅。很多语言把排序做成一堆复杂的接口,但 Python 的思路很简单:只提供两个核心工具,然后把扩展能力交给开发者。

attachments-2026-03-DoFaM4Gb69c5de7225718.pngPython 的排序设计非常优雅。很多语言把排序做成一堆复杂的接口,但 Python 的思路很简单:只提供两个核心工具,然后把扩展能力交给开发者。

最常见的排序方式其实只有两个。一个是 sorted(),它不会改变原始数据,而是返回一个新的列表;另一个是 list.sort(),它直接在原列表上排序。很多初学者不太注意这两者的区别,但在实际开发中差别很大。如果你还需要保留原始数据,就用 sorted();如果只是为了得到排序结果,并且不需要原列表,那么 list.sort() 会更高效一些。

data = [5, 2, 3, 1, 4]

print
(sorted(data))   # 返回新列表
print
(data)           # 原列表不变

data.sort()           # 原地排序
print
(data)

Python 排序真正强大的地方在于 key 参数。很多语言的排序函数需要写复杂的比较函数,而 Python 只需要提供一个“提取关键值”的函数。排序算法会先计算每个元素的 key,然后根据 key 来排序。这样的设计不仅代码更简洁,而且性能更好,因为每个 key 只计算一次。

比如对字符串进行忽略大小写排序:

words = ["apple", "Banana", "cherry"]
print
(sorted(words, key=str.casefold))

如果是复杂对象,也可以直接提取属性:

students = [
    ("Alice", 22),
    ("Bob", 19),
    ("Cindy", 21)
]

print
(sorted(students, key=lambda s: s[1]))

当排序逻辑只是“取某个字段”时,Python 甚至提供了更高效的工具。operator 模块中的 itemgetter 和 attrgetter 可以直接作为 key 使用,既简洁又更快。

from operator import itemgetter

students = [
    ("Alice", 22),
    ("Bob", 19),
    ("Cindy", 21)
]

print
(sorted(students, key=itemgetter(1)))

我认为 Python 排序还有一个经常被忽略但非常重要的特性:排序是稳定的。稳定排序意味着,如果两个元素的排序 key 相同,它们在排序前后的相对顺序不会改变。这个特性在多字段排序时非常有用。比如先按年龄排序,再按姓名排序,只要顺序正确,最终结果会保持逻辑一致。

降序排序也非常简单,只需要增加一个参数:

sorted(data, reverse=True)

还有一种情况是需要自定义复杂的比较逻辑,比如根据语言规则比较字符串。Python 本身已经不再直接支持 cmp 比较函数,但可以通过 functools.cmp_to_key() 把比较函数转换成 key。

from functools import cmp_to_key

def
 compare(a, b):
    return
 len(a) - len(b)

data = ["apple", "cat", "banana"]
print
(sorted(data, key=cmp_to_key(compare)))

Python 排序设计最值得学习的一点是它不仅考虑了“完整排序”,还考虑了“只需要部分结果”的情况。有时候我们并不需要把整个列表排序,只是想找出最大的几个元素。如果这时候仍然使用完整排序,其实是一种性能浪费。

Python 提供了 heapq 模块,可以非常高效地解决这种问题。

import heapq

data = [5, 1, 9, 3, 7, 8]

print
(heapq.nlargest(3, data))
print
(heapq.nsmallest(2, data))

在很多真实场景中,比如排行榜、热门推荐、日志分析,往往只需要 Top N 的结果,这种方法会比完整排序更高效。

从整体设计来看,Python 的排序机制其实非常克制。核心接口很少,但扩展能力很强。key 函数解决了绝大多数排序需求,稳定排序保证了逻辑可靠,而像 heapq 这样的工具则让性能优化变得简单。

我一直觉得,一个好的语言设计往往不是功能越多越好,而是用尽可能少的工具解决尽可能多的问题。Python 的排序机制正是这种设计思想的一个典型例子。理解这些细节之后,再看日常代码中的排序操作,其实会发现很多写法都可以变得更优雅一些。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2026-03-27 09:33
  • 阅读 ( 24 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1920 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 1920 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章