[英]Python IndexError: list index out of range when looking at if statement
我無法克服此錯誤。 我正在執行類似於mergesort中的merge的例程。 也許我實例化了一些錯誤。 這是代碼:
def MergeAndCountSplitInv(arr, length):
left = arr[0:length/2]
right = arr[length/2+1: length]
i = 0
j = 0
numSplitInv = 0
newArray = [0] * length
for k in range(len(arr)):
if (left[i] < right[j]):
#newArray.insert(k, left[i])
newArray.append(left[i])
i = i + 1
else: #(right[j] < left[i]
#newArray[k].insert(k, right[j])
newArray.append(right[j])
j = j + 1
numSplitInv = numSplitInv + (length/2 - i)
return ReturnValue(newArray, numSplitInv)
錯誤給出為:
File "InversionCount.py", line 31, in MergeAndCountSplitInv if (left[i] < right[j]): IndexError: list index out of range
感謝您的任何幫助
問題之一是您對切片索引的理解。 這兩行:
left = arr[0:length/2]
right = arr[length/2+1: length]
應該更改為:
left = arr[:length/2]
right = arr[length/2:]
包含開始索引,而結束索引是切片中未包含的第一個元素,因此,要獲得完整的分區,請在左側的末尾使用與右側的末尾相同的索引。
但是真正的問題是,您要遞增i
和j
而不檢查您是否走過left
或right
的末尾,因此最終會出現索引錯誤。
您忘了檢查是否已經使用了列表中的所有元素,如果有的話,則擴展其他元素。
為了使問題更加明顯,考慮一下您的列表最終是否像這樣:
right = [1, 2, 3, 4]
left = [5, 6, 7, 8]
然后,您將在到達left
之前附加所有right
-但您仍將嘗試查看right[5] < left[0]
-這將給出您看到的錯誤。 您需要檢查兩個列表中的哪一個都用盡,例如:
if i >= len(right):
newArray.extend(left)
break
對於j >= len(left)
情況也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.