【问题标题】:Python IndexError: list index out of range when looking at if statementPython IndexError:查看if语句时列表索引超出范围
【发布时间】:2012-07-17 02:55:48
【问题描述】:

我无法克服这个错误。我正在做一个类似于合并排序中的合并的例程。也许我实例化了一些错误。代码如下:

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

感谢您的帮助

【问题讨论】:

    标签: python arrays list indexing


    【解决方案1】:

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

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

    应该改为:

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

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

    但真正的问题是,你在增加 ij 时没有检查你是否离开了 leftright 的末尾,所以你最终会遇到索引错误。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        然后您将在到达left 的末尾之前附加所有right - 但您仍将尝试查看是否right[5] &lt; left[0] - 这将给出您看到的错误。您需要检查其中一个列表何时用尽 - 例如:

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

        j &gt;= len(left) 的情况类似。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-25
          • 2017-04-05
          • 2012-07-15
          • 2013-06-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多