Python IndexError:查看if语句时列表索引超出范围
问题描述:
我无法克服此错误。我正在做一个类似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
感谢您的帮助
答
的一个问题是你的片指标的理解。这两条线路:
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
- 但是,你会仍然尝试看看是否会产生你看到的错误。您需要添加一个检查时,其中一个清单耗尽了 - 是这样的:
if i >= len(right):
newArray.extend(left)
break
,同样为j >= len(left)
情况。