Python中如何查找列表中首个连续+1递增序列的起始索引
问题描述
给定一个步长不固定的递增列表,要求找到第一个开始仅以+1为步长持续递增的元素的索引,约束条件为列表一旦进入+1步长递增状态就会一直保持,也可能全程不存在该区间。
示例输入:[ 0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
示例输出:8,对应起始元素为23。
现有实现的问题
你当前使用的实现存在漏洞:
for (a,b) in zip(l, l[1:]): if b-a == 1: print(l.index(a)) break
如果列表中存在重复元素,l.index(a)会返回该元素第一次出现的索引,而非当前遍历位置的索引,会得到错误结果。
更简洁优雅的实现方案
方案1:迭代器写法(最简洁)
时间复杂度O(n),无额外空间开销,不存在符合条件的区间时自动返回None:
res = next((i for i, (a, b) in enumerate(zip(l, l[1:])) if b - a == 1), None) print(res)
说明:直接用
enumerate同步获取索引,完全规避了index()方法的漏洞,同时用生成器表达式+next()的组合实现了找到第一个符合条件的结果就停止遍历的逻辑,和需求完全匹配。
方案2:兼容传统循环写法
如果需要更易读的分支逻辑,可简化为如下写法:
for i, (a, b) in enumerate(zip(l, l[1:])): if b - a == 1: print(i) break else: print(None) # 没有符合条件的区间时的兜底处理
内容的提问来源于stack exchange,提问作者Clement Attlee
相关产品推荐
相关产品推荐

