当前位置:首页>python>Python排序原来这么简单:一文搞懂 sorted、key 和高效排序技巧

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

  • 2026-09-08 18:18:21
Python排序原来这么简单:一文搞懂 sorted、key 和高效排序技巧

Hello!我是简讯。一名后端编程业余选手。

曾就职于北京某智能旅行规划公司,做 Python 后端开发,现就职于某国企。公众号主要分享编程相关技巧,同时分享好用好玩的资源。编辑器酷爱 Neovim。

想在第一时间收到文章推送,请关注、星标和置顶「爱生活爱扣钉」

★

欢迎关注 爱生活爱扣钉

★

- 记得在底部菜单栏领取福利 -

免费精品资源分享

https://knxhub.top

Python 的排序设计非常优雅。很多语言把排序做成一堆复杂的接口,但 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 的排序机制正是这种设计思想的一个典型例子。理解这些细节之后,再看日常代码中的排序操作,其实会发现很多写法都可以变得更优雅一些。

# 每天更新一下自己 #

# 感谢你的阅读 #

最新文章

随机文章