问题是您只进行一次检查,并始终立即返回True或False。
相反,在检查完整个列表之前,不应该返回“True”:
def des(l):
for i in range(len(l)):
if (l[i]
return [False,i]
return True这会给你另一个问题,但是:
>>> des([4,3,2,1])
Traceback (most recent call last):
File "", line 1, in
File "", line 3, in des
IndexError: list index out of range这是因为当您到达range中的最后一个值时,您会查看超出列表末尾的值。解决这个问题的最简单方法是从您的范围中减去一个:
def des(l):
for i in range(len(l) - 1):
if (l[i]
return [False,i]
return True在python中,使用range(len(...))通常是不好的做法。更好的选择是enumerate,它返回一系列(index, value)对,但这并不能解决上述问题:
def des(l):
for i, v in enumerate(l):
if (v < l[i+1]):
return [False,i]
return True这仍然有IndexOutOfRange错误。我们可以通过假装我们迭代的列表来解决这个问题:
def des(l):
for i, v in enumerate(l[:-1]):
if (v < l[i+1]):
return [False,i]
return True而且你有更多的“pythonic”(即python专家会做的风格)解决方案。
此代码还有另外一个unpythonic问题:如果你执行if des(my_list)): ...,它将无效。这是因为非空的list(您在return语句中使用[]创建的内容始终是真的。
如果你想获得升序项的索引,那么实际上没有任何方法,但应该在函数名中更清楚。
另外,你做不到
is_descending, bad_index = des(...)因为您只是在成功时返回True。更好的是
def des(l):
for i, v in enumerate(l[:-1]):
if (v < l[i+1]):
return (False,i)
return (True, None)另请注意,我使用括号对结果对进行分组,这会创建一个新的tuple。通常,如果所有成员表示相同的事物,则应使用lists,如果成员表示不同的事物,则应使用tuple,例如在这种情况下,它们表示结果,以及发生故障的位置。