我无法克服此错误。我正在做一个类似于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
感谢您的帮助
答案 0 :(得分:3)
一个问题是您对切片索引的理解。这两行:
left = arr[0:length/2]
right = arr[length/2+1: length]
应更改为:
left = arr[:length/2]
right = arr[length/2:]
包含起始索引,结束索引是切片中包含的第一个元素 not ,因此要获得完整的分区,请使用相同的索引作为左边的结尾右边的开始。
但真正的问题是你增加了i
和j
而没有检查你是否已经离开了left
或right
,所以你最终得到了索引错误。
答案 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)
案例。