我需要一个按字母顺序排列我的列表的函数,如果列表没有按字母顺序排序,则返回False
,如果是,则返回True
。
它应该像这样工作:
>>> ordered(['Cilka', 'Berta', 'Dani', 'Ana', 'Ema'])
False
>>> ordered(["Ana", "Berta", "Cilka", "Dani", "Ema"])
True
名称是斯洛文尼亚语,不介意。
我写了这个:
def ordered(s):
s
是列表的名称。你能救我吗?
答案 0 :(得分:1)
由于字符串的排序已经是按字母排序的,因此您可以使用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)
成本,而不是其他两种方法所暗示的。