有没有一种方法可以为排序不变的空列表返回true?

时间:2019-08-13 15:17:20

标签: python-3.x python-3.7

因此,我应该编写一个函数,如果所述序列从最小到最大排列,则返回true。我能够理解字符串和num列表,但是对于一个空列表,我无法理解为什么它不会返回true。

这是为了了解并可能帮助我理解如何更好地操纵循环。

def is_sorted(seq):

    for i in range(0, len(seq)):
        if seq[i]<seq[i+1]:
            return True
        else:
            return False
print(is_sorted([])) # expected to be true but returns none

4 个答案:

答案 0 :(得分:3)

一个明显的问题是,如果列表为空,您将返回None,其结果为false。另一个问题是您在循环内使用return,这意味着您没有评估可迭代对象中的每个序列。

@hiro主角的答案是解决此问题的一种方法。我提供了使用all和生成器表达式的替代方法。

def is_sorted(seq):
    return all(seq[i] < seq[i + 1] for i in range(len(seq) - 1))

# All evaluate True
print(is_sorted(['a', 'b', 'c']))
print(is_sorted([1, 2, 3]))
print(is_sorted([]))

# Both evaluate False
print(is_sorted(['a', 'c', 'b']))
print(is_sorted([0, 1, -1]))

编辑并解释

据我所知,all的工作方式是逐步遍历一个可迭代对象,如果其中的任何值等于False,则返回False,否则返回True

正如评论所示,我对Python生成器没有很好的理解。生成器是一个可迭代的对象,它计算下一个值,并在每次引用它时将其返回。

上面定义的生成器,每次all引用它时,都会计算seq[i] < seq[i + 1]并将该值返回。如果任何时候都是False,则all将返回False

我希望这会有所帮助。我确信评论中的好人之一将纠正我的任何有误的理解。

答案 1 :(得分:1)

您的实现是错误的。因为它仅比较前两个元素(在第一次迭代后返回True,所以它将为[1, 3, 2]返回return

可以通过检查相反的条件然后在循环后return True来解决此问题。

您还应该迭代直到len(seq) - 1,否则最后一次迭代将导致IndexError

def is_sorted(seq):
    for i in range(0, len(seq) - 1):
        if seq[i] > seq[i + 1]:
            return False
    return True

print(is_sorted([1, 2, 3]))
# True
print(is_sorted([1, 3, 2]))
# False
print(is_sorted([]))
# True

当然有一个简单的天真解决方案,

def is_sorted(seq):
    return seq == sorted(seq)

答案 2 :(得分:1)

这是一个变体,也适用于空列表和长度为1的列表。

from itertools import islice

def is_sorted(seq):
    return all(i <= j for i, j in zip(seq, islice(seq, 1, None)))

它使用zipisliceseq[k]seq[k+1]上进行迭代。并且仅当all个元素满足True的条件时才会返回。

答案 3 :(得分:0)

这是因为对于空列表,未到达for内的代码。因此都没有返回语句。此外,您还应考虑到只有一个元素的列表也应返回True。解决方案:

def is_sorted(seq):
    for i in range(0, len(seq)-1):
        if seq[i]>=seq[i+1]:
            return False
    return True