簡體   English   中英

Python IndexError:查看if語句時列表索引超出范圍

[英]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:]

包含開始索引,而結束索引是切片中包含的第一個元素,因此,要獲得完整的分區,請在左側的末尾使用與右側的末尾相同的索引。

但是真正的問題是,您要遞增ij而不檢查您是否走過leftright的末尾,因此最終會出現索引錯誤。

您忘了檢查是否已經使用了列表中的所有元素,如果有的話,則擴展其他元素。

為了使問題更加明顯,考慮一下您的列表最終是否像這樣:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM