python-3.x - 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。
解决方案
当您在每次递归中将列表除以一半时,它最终会变成一个空列表。
如果输入是一个空列表,那么任何索引当然都超出范围:
[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
推荐阅读
- mongodb - Mongodb的“更大”和“更少”在有索引的情况下运行得更快吗
- mule - Munit 2.1 模拟 Map 响应并将其作为文件引用
- angular - Angular NgRx 选择器返回未定义
- javascript - 如何阻止控件用鼠标移动立方体(gift/page2)
- loopback4 - 环回 4 模型模式验证的自定义错误消息
- django - Django API 状态码 200,但数据库中的数据未更新
- xml - 如何使用键值对多部分表单数据在空手道中上传 xml 文件?
- java - 如何为 java 程序创建持久内存?
- java - 这两个链表构造函数有什么区别?
- git - 如何让 git 忽略 MS Office 创建的临时文件(以 ~$ 开头)