1 回答
TA贡献1809条经验 获得超8个赞
主要问题是您编写for i in range(len(xs)):然后尝试访问xs[i+1]. 这必然会IndexError: list index out of range在循环的最后一次迭代中引发异常。
代码的第二个问题是else: Trueorelse: False部分,它什么也不做。您可能忘记了关键字return。就目前而言,您的代码相当于:
import operator
def sorted (a, xs):
'''a is the operator, xs is a list'''
if a == operator.gt:
for i in range(len(xs)):
if xs[i] < xs[i+1]:
return False
i == len(xs)-1
当和i+1
1 太大时,将在循环的最后一次迭代中引发异常。
是否会得到异常IndexError: list index out of range
取决于for
-loop 是否有机会继续其最后一次迭代,或者函数是否会在 -loopreturn
的最后一次迭代之前for
。
另一个问题是你调用了你的 function sorted
,它已经是 python 中内置函数的名称。重复使用该名称会导致混乱和可能的错误。由于您的函数不返回排序列表,而是测试列表是否已排序,因此我建议改为调用它is_sorted
。
要同时解决这两个问题:
删除
else
分支;添加与关键字
return True
相同级别的缩进for
;range(len(xs))
用。。。来代替range(len(xs)-1)
。
-1
你明白这里的必要性吗?想象一下,如果您的列表有 3 个元素。需要进行多少次比较才能检查是否已排序?您需要将第一个元素与第二个元素进行比较;然后是第二个和第三个;就是这样。3 个元素仅进行 2 次比较。如果省略-1
,您将尝试将第三个元素与虚构的第四个元素进行比较,并且 python 解释器会抱怨并引发IndexError: list index out of range
。
最终代码:
import operator
def is_sorted (a, xs):
'''a is the operator, xs is a list'''
if a == operator.gt:
for i in range(len(xs)-1):
if xs[i] < xs[i+1]:
return False
return True
遵循 python 约定:可选参数reverse
a
与参数进行比较operator.gt
有点笨拙,因为编写的函数无论如何都不能与自定义运算符一起使用。我建议遵循python 内置函数sorted
和 的list.sort()
约定,它使用默认reverse
为 的可选参数False
。
代码:
def is_sorted(xs, reverse=False):
if not reverse:
for i in range(len(xs)-1):
if xs[i] > xs[i+1]:
return False
return True
else:
for i in range(len(xs)-1):
if xs[i] < xs[i+1]:
return False
return True
进一步改进建议:
添加可选参数,
key
如 python 内置函数sorted
和list.sort
;让用户给你一个比较运算符,并直接使用该运算符而不是
<
or>
使用或 的替代代码any
all
def is_sorted(xs):
return all(xs[i] <= xs[i+1] for i in range(len(xs)-1))
def is_sorted(xs):
return not any(xs[i] > xs[i+1] for i in range(len(xs)-1))
添加回答
举报