Python查找首个非连续元素时遇IndexError: list index out of range求助
解决首个非连续元素查找的索引越界问题
首先,咱们先拆解你代码里的核心问题:
- 循环变量用错了:你用
for n in arr时,n是数组里的元素值,不是索引!但你后面写了arr[n + 1],这会导致当n是数组最后一个元素时,n+1远超过数组的最大索引,直接触发IndexError。比如全连续数组[1,2,3,4,5],最后一个n是5,arr[5+1]就是访问第6个元素,而数组只有5个元素,肯定越界。 - 逻辑判断偏离需求:题目要求返回首个非连续的元素(比如
[1,2,3,4,6]里的6),但你的代码里if n + 1 not in arr: return n + 2完全不符合需求,而且elif里直接return会导致循环提前终止,根本没法遍历完整个数组。
修正后的代码思路
正确的做法是遍历数组的索引,依次比较当前元素和下一个元素是否连续:
- 遍历范围从索引0到倒数第二个元素(避免访问最后一个元素的下一个位置)
- 如果当前元素+1不等于下一个元素,直接返回下一个元素
- 如果遍历完所有相邻元素都连续,返回
None
修正后的代码
def first_non_consecutive(arr): # 遍历索引,从0到len(arr)-2(保证能访问到i+1的位置) for i in range(len(arr) - 1): current = arr[i] next_num = arr[i+1] if current + 1 != next_num: return next_num # 所有元素都连续,返回None return None
测试验证
- 测试非连续数组:
first_non_consecutive([1,2,3,4,6,7,8,9])返回6,符合预期 - 测试全连续数组:
first_non_consecutive([1,2,3,4,5,6,7,8])返回None,不会再触发索引越界错误
额外说明
你之前用n + 1 not in arr的写法还有效率问题:in操作在列表里是O(n)时间复杂度,当数组很大时会很慢,而直接通过索引比较是O(1),效率高很多。
内容的提问来源于stack exchange,提问作者MoneyLuke
相关产品推荐
相关产品推荐

