使用相同的 'for' 循环和 'all()' 函数会产生不同的结果

Using identical 'for' loop and 'all()' function yield different results

我正在学习 Python 并尝试一个简单的练习:使用 for 循环检查列表是否有序,并为此创建一个函数。

这是我的代码,效果很好:

def is_sorted(mylist):
    if all(mylist[i] <= mylist[i+1] for i in range(len(mylist)-1)):
        return True
    else:
        return False

mylist = [2, 7, 5, 4, 4, 8, 3, 1]

is_sorted(mylist)

它 returns 它应该是假的。我已经测试了其他几个列表,它们都运行良好。但是当我稍微修改代码时,它不再起作用了:

def is_sorted(mylist):
    for i in range(len(mylist)-1):
        if all(mylist[i] <= mylist[i+1]):
            return True
        else:
            return False

mylist = [2, 7, 5, 4, 4, 8, 3, 1]

is_sorted(mylist)

错误代码如下:

/var/folders/xxxxx.py in is_sorted(mylist)
      1 def is_sorted(mylist):
      2     for i in range(len(mylist)-1):
----> 3         if all(mylist[i] <= mylist[i+1]):
      4             return True
      5         else:

TypeError: 'bool' object is not iterable

在我看来,这两个片段是相同的。我不确定为什么第二个不起作用。我错过了什么?

你想多了。

如错误消息所述,all() 需要一个可迭代对象,如列表或元组。您正在对两个整数进行单次比较,因此无需迭代。

要解决,如果我们看到一对违反排序约束的元素,请将 for 循环更改为 return False。如果我们的迭代没有发现任何违规,return True。这模仿了 all():

的实际行为
def is_sorted(mylist):
    for i in range(len(mylist)-1):
        if mylist[i] > mylist[i+1]:
            return False
    return True