别再排序来检查顺序:Python 中 5 种快速 O(n) 方法
发布: (2026年2月17日 GMT+8 13:41)
2 分钟阅读
原文: Dev.to
Source: Dev.to
使用 sort() 仅仅为了验证顺序的问题
一个常见的错误(我自己也曾犯过):
def is_sorted_bad(lst):
return lst == sorted(lst)
Python 的 Timsort O(n log n),并且会复制整个列表。
对于一百万个元素,这大约需要 2000 万次操作并占用额外的内存——仅仅为了得到一个是/否的答案! 😩
顺序类型
- 非递减(允许重复)
lst[i + 1]:
return False
return True
all() + range
def is_sorted(lst):
return all(lst[i] = y for x, y in zip(lst, lst[1:]))
边界情况
- 空列表或单元素列表 → 始终
True - 混合类型 →
TypeError(用try/except包裹) None值 → 手动处理
方法比较
| 方法 | 时间 / 空间 说明 | 最适用场景 |
|---|---|---|
all() + zip() | 可读性好,常用 | 日常使用 |
for 循环 | 清晰,无技巧 | 面试题 |
all() + range() | 需要索引时很有用 | 扩展(例如查找第一次违例) |
pairwise() | 真正的 O(1) 空间 | 现代 Python(3.10+) |
operator.le(或 operator) | 适用于自定义对象 | 基于键或属性的排序 |
NumPy 与 Pandas 快捷方式
# NumPy
np.all(arr[:-1] <= arr[1:])
# Pandas
series.is_monotonic_increasing
当你本来就需要排序后的列表时
如果已经需要排序后的列表,直接调用 .sort()——在已排序数据上 Timsort 的运行时间是 O(n)!
你最常使用哪种方法? 在下方留言吧 👇