Python IndexError:查看if语句时列表索引超出范围

时间:2012-07-17 02:55:49

标签: python arrays list indexing

我无法克服此错误。我正在做一个类似于mergesort中的合并的例程。也许我在实例化错误。这是代码:

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

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

一个问题是您对切片索引的理解。这两行:

left = arr[0:length/2]
right = arr[length/2+1: length]

应更改为:

left = arr[:length/2]
right = arr[length/2:]

包含起始索引,结束索引是切片中包含的第一个元素 not ,因此要获得完整的分区,请使用相同的索引作为左边的结尾右边的开始。

但真正的问题是你增加了ij而没有检查你是否已经离开了leftright,所以你最终得到了索引错误。

答案 1 :(得分:1)

你忘记检查你是否已经消耗了列表中的所有元素,并且如果你已经使用其他元素,则会延长。

答案 2 :(得分:1)

为了使问题更加明显,请考虑一下您的列表是否会像这样:

right = [1, 2, 3, 4]
left = [5, 6, 7, 8]

然后,在right结束之前,您会附加所有left - 但您仍会尝试查看right[5] < left[0] - 这会给出您看到的错误。你需要在任何一个列表用尽时添加一个检查 - 例如:

if i >= len(right):
   newArray.extend(left)
   break

,同样适用于j >= len(left)案例。