按字母顺序排序列表的功能?

时间:2014-11-03 09:08:49

标签: python list

我需要一个按字母顺序排列我的列表的函数,如果列表没有按字母顺序排序,则返回False,如果是,则返回True

它应该像这样工作:

>>> ordered(['Cilka', 'Berta', 'Dani', 'Ana', 'Ema'])
False
>>> ordered(["Ana", "Berta", "Cilka", "Dani", "Ema"])
True

名称是斯洛文尼亚语,不介意。

我写了这个:

def ordered(s):

s是列表的名称。你能救我吗?

1 个答案:

答案 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,你可以使用izipislice

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

正如您所见,ordered2ordered3的速度比ordered快。这是因为初始排序操作意味着O(n·ln)成本,而不是其他两种方法所暗示的。