检查列表是否排序的Pythonic方法
有没有一种简单的方法可以检查一个列表是否已经按 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
,那就用>=
代替<=
。