使用相同的 '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
我正在学习 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