别再排序来检查顺序: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)


你最常使用哪种方法? 在下方留言吧 👇

原始文章来源

0 浏览
Back to Blog

相关文章

阅读更多 »

Python 中的实例变量和实例方法

Python 中的实例变量与实例方法 在面向对象编程(Object‑Oriented Programming,OOP)中,你必须掌握的两个概念是: - 实例变量 - 实例方法

Leetcode 696 题解

抱歉,我没有看到需要翻译的文本。请提供要翻译的摘录或摘要内容,我会为您翻译成简体中文。