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))
添加回答
舉報