检查列表是否排序的Pythonic方法

201 投票
27 回答
186485 浏览
提问于 2025-04-16 04:23

有没有一种简单的方法可以检查一个列表是否已经按 ASC(升序)或 DESC(降序)排序?

listtimestamps = [1, 2, 3, 5, 6, 7]

比如说,像 isttimestamps.isSorted() 这样的函数,返回 True(真)或 False(假)。

我想输入一组消息的时间戳,然后检查这些交易是否按正确的顺序出现。

27 个回答

56

这种迭代器的使用方式比用整数索引快10-15%。

# python2 only
if str is bytes:
    from itertools import izip as zip

def is_sorted(l):
    return all(a <= b for a, b in zip(l, l[1:]))
121

我建议你直接使用

if sorted(lst) == lst:
    # code here

除非你的列表非常大,这种情况下你可能需要写一个自定义的函数。

如果你只是想在列表没有排序的时候进行排序,那就别检查了,直接排序就行。

lst.sort()

别想太多。

如果你想要一个自定义的函数,可以这样做:

def is_sorted(lst, key=lambda x: x):
    for i, el in enumerate(lst[1:]):
        if key(el) < key(lst[i]): # i is the index of the previous element
            return False
    return True

不过,如果列表已经排好序,这个方法的时间复杂度是O(n)(而且在一个for循环里也是O(n)!),所以,除非你大多数时候都觉得列表不会是排好序的(而且比较随机),我还是建议你直接排序列表。

284

这里有一个一行代码:

all(l[i] <= l[i+1] for i in range(len(l) - 1))

如果你在用Python 2的话,记得用xrange代替range

如果要用reverse=True,那就用>=代替<=

撰写回答