2012-07-17 46 views
0

我无法克服此错误。我正在做一个类似mergesort合并的例程。也许我正在实例化错误。下面的代码:Python IndexError:查看if语句时列表索引超出范围

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

的一个问题是你的片指标的理解。这两条线路:

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

应改为:

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

开始索引被包括在内,最终指数是包含在片中的第一件,所以要得到一个完整的分区,您在左侧的末尾使用与右侧相同的索引。

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

1

您忘记检查您是否已经使用了列表中的所有元素,并且如果已经使用了其他元素,则将其扩展。

1

为了使问题稍微更加明显,想一想如果你的列表最终会被这样的事情:

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

然后你到达的left结束之前,你会追加所有right - 但是,你会仍然尝试看看是否会产生你看到的错误。您需要添加一个检查时,其中一个清单耗尽了 - 是这样的:

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

,同样为j >= len(left)情况。

相关问题