首页 > 解决方案 > IndexError:与单个值相比,列表索引超出范围

问题描述

这是我试图在 python3 中使用递归解决的旋转数组中的二进制搜索问题。我计算 List 中的中间索引并将其与目标值进行比较,它给出了 IndexError

def search(self, nums: List[int], target: int) -> int:
        numlen=len(nums)
        mid=numlen//2
        if nums[mid]==target:
            return mid
        else:
            left=self.search(nums[:mid],target)
            if left!=-1:
                return left
            right=self.search(nums[mid:],target)
            if right!=-1:
                return right+mid
            if(left==-1 & right==-1):
                return -1

预期的输出应该是列表中目标的索引,如果没有找到应该返回 -1,但是它显示 IndexError: list index out of range。

标签: python-3.xrecursion

解决方案


当您在每次递归中将列表除以一半时,它最终会变成一个空列表。

如果输入是一个空列表,那么任何索引当然都超出范围:

[1, 1, 1, 1] -> [1, 1] -> [1] -> []
nums = []
numlen = len(nums)  # len = 0
mid = numlen // 2   # mid = 0
nums[mid]           # oops

要修复,您必须显式检查空列表,并返回-1“未找到”:

def search(self, nums: List[int], target: int) -> int:
    numlen = len(nums)
    if numlen == 0:
        return -1
    mid = numlen // 2

或者pythonic的方式来做到这一点:

def search(self, nums: List[int], target: int) -> int:
    if not nums:
        return -1

推荐阅读