【问题标题】:Function for ordering a list alphabetically? [duplicate]按字母顺序排列列表的功能? [复制]
【发布时间】:2014-12-29 21:56:32
【问题描述】:

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

它应该像这样工作:

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

名字是斯洛文尼亚语,别介意。

我写了这个:

def ordered(s):

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

【问题讨论】:

  • “我已经写了这个” - 在把你的作​​业交给我们之前,你一直努力到函数定义结束,真是太好了。
  • 你的标题说你想订购一个列表,你的问题说你想知道一个列表是否被订购。它是哪一个? Please edit

标签: python list


【解决方案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

如您所见,ordered2ordered3ordered 快得多。这是因为初始排序操作隐含了O(n·ln) 成本,而其他两种方法没有隐含。

【讨论】:

  • def urejen(s): return s == sorted(s) urejen(['Cilka', 'Berta', 'Dani', 'Ana', 'Ema']) 我有什么做,所以它会打印 false 或 true ?因为它不打印它...
  • 在调用函数之前添加打印? print urejen(['Cilka', 'Berta', 'Dani', 'Ana', 'Ema'])
猜你喜欢
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多