确定列表是否按降序排列

2024-06-25 23:02:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个函数来测试列表是否按降序排列。这是我目前所拥有的,但似乎并不适用于所有列表。

我使用了列表[9,8,5,1,4,3,2],它返回了'true'

我好像不知道我的错误在哪里。

def ordertest(A):
    n = len(A)
    for i in range(n):
        if A[i] >= A[i+1]:
            return 'true'
        else:
            return 'false'

Tags: 函数infalsetrue列表forlenreturn
3条回答

您应该进行反向检查(只要得到A[i] < A[i+1],就返回false

def ordertest(A):
    for i in range( len(A) - 1 ):
        if A[i] < A[i+1]:
            return False
        return True

您可以迭代输入,而不是使用索引:

def ordertest(iterable):
    it = iter(iterable)
    prev = next(it)
    for e in it:
        if e > prev:
            return False
        prev = e
    return True

注意,返回字符串'true''false'是一个坏主意。相反,您可以使用Python的内置booleans

使用a generator expressionthe ^{} builtin可以轻松完成此操作:

all(earlier >= later for earlier, later in zip(seq, seq[1:]))

例如:

>>> seq = [9, 8, 5, 1, 4, 3, 2] 
>>> all(earlier >= later for earlier, later in zip(seq, seq[1:]))
False
>>> seq = [9, 8, 5, 4, 3, 2] 
>>> all(earlier >= later for earlier, later in zip(seq, seq[1:]))
True

这应该是一个好的、快速的方法,因为它避免了python端的循环,很好地短路(如果您在2.x中使用itertools.izip()),并且是好的、清晰的、可读的(例如,避免了索引上的循环)。

注意,所有迭代器(不仅仅是序列)的通用解决方案也是可能的:

first, second = itertools.tee(iterable)
next(second)
all(earlier >= later for earlier, later in zip(first, second))

相关问题 更多 >