如何提取列表中连续序列的首个元素?附末尾元素提取需求
解决连续序列首尾元素提取问题
问题分析
你的需求是从有序列表中提取长度≥2的连续递增1子序列的首个和末尾元素,现有代码存在以下核心问题:
- 仅检查三个连续元素,无法处理长度为2或超过3的连续序列
- 循环条件
i < len(lst)-2会忽略列表末尾的连续元素 - 错误包含非连续元素(如0、21、26)
解决方案
以下是可以同时提取连续序列首尾元素的代码,通过遍历定位每个连续序列的起始和结束位置实现需求:
def get_consecutive_bounds(lst): starts = [] ends = [] n = len(lst) i = 0 while i < n: # 检测是否进入连续序列(至少包含两个元素) if i < n - 1 and lst[i+1] == lst[i] + 1: start = lst[i] # 向后遍历找到连续序列的结束位置 j = i + 1 while j < n and lst[j] == lst[j-1] + 1: j += 1 end = lst[j-1] starts.append(start) ends.append(end) # 跳过已处理的连续序列,避免重复遍历 i = j else: i += 1 return starts, ends
测试验证
使用你的输入列表测试:
input_lst = [0,2,3,4,6,7,8,16,17,18,21,23,24,26,34,35,36,37,38,40,41,46,47] starts, ends = get_consecutive_bounds(input_lst) print(starts) # 输出: [2, 6, 16, 23, 34, 40, 46] print(ends) # 输出: [4, 8, 18, 24, 38, 41, 47]
代码逻辑说明
- 遍历列表时,先判断当前元素与下一个元素是否连续(差值为1)
- 若进入连续序列,从当前位置向后遍历,直到元素不再连续,记录起始和末尾元素
- 跳过整个已处理的连续序列,避免重复遍历
- 非连续元素直接跳过,不加入结果集
内容的提问来源于stack exchange,提问作者Ho Yeung - Lee-Maiva
相关产品推荐
相关产品推荐

