由于字符串的排序已经是字母顺序,你可以使用sorted:
def ordered(lst):
return lst == sorted(lst)
示例
>>> ordered(['Cilka', 'Berta', 'Dani', 'Ana', 'Ema'])
False
>>> ordered(["Ana", "Berta", "Cilka", "Dani", "Ema"])
True
这种方法的问题在于它会在比较之前生成列表的排序版本。因此,如果列表真的很大,您可以检查每个元素是否在字典顺序中位于以下元素之前:
def ordered2(lst):
return all(lst[i] <= lst[i + 1] for i in xrange(len(lst) - 1))
示例
副作用是这个生成列表的排序版本。如果列表真的很大,您可以检查每个元素是否在字典顺序中位于以下元素之前:
>>> ordered2(['Cilka', 'Berta', 'Dani', 'Ana', 'Ema'])
False
>>> ordered2(["Ana", "Berta", "Cilka", "Dani", "Ema"])
True
或者如果你真的想要超级懒惰和超级pythonic,你可以使用izip和islice:
from itertools import izip, islice
def ordered3(lst):
return all(x <= y for x, y in izip(islice(lst, 0), islice(lst, 1)))
时间比较
让我们生成一个大的随机数字列表(该方法适用于所有可比较且具有排序的数字):
In [20]: from random import shuffle
In [21]: lst = range(10000)
In [22]: shuffle(lst)
In [23]: %timeit ordered(lst)
1000 loops, best of 3: 1.48 ms per loop
In [24]: %timeit ordered2(lst)
1000000 loops, best of 3: 696 ns per loop
In [25]: %timeit ordered3(lst)
1000000 loops, best of 3: 602 ns per loop
如您所见,ordered2 和 ordered3 比 ordered 快得多。这是因为初始排序操作隐含了O(n·ln) 成本,而其他两种方法没有隐含。