Python如何从列表中提取差值为1的连续元素组成子列表
问题分析&代码修改
原有代码存在3个核心错误:
- 变量名不统一:定义的子列表变量为
sub_list,但实际追加元素时误用了sub_array,属于笔误 - 索引逻辑错误:内层循环
ii从i起始时,第一次判断就访问了lst[ii-1],如果i=0会直接取到列表最后一位元素,逻辑完全错位 - 重复遍历逻辑:外层循环每次i自增后都会重新扫描后续元素,导致生成大量重复的短子序列,例如扫完
[3,4,5]后,又会从4、5起始重新扫描得到[4,5]、[5]这类多余结果
修正后代码
lst = [1, 3, 4, 5, 8, 10, 14, 20, 21, 22, 23, 40, 47, 48] final_list = [] if not lst: # 处理空列表边界情况 print(final_list) exit() sub_list = [lst[0]] for num in lst[1:]: if num - sub_list[-1] == 1: sub_list.append(num) else: # 只保留长度>=2的连续序列,符合输出要求 if len(sub_list) >= 2: final_list.append(sub_list) sub_list = [num] # 不要漏掉遍历结束后最后一个子序列的判断 if len(sub_list) >= 2: final_list.append(sub_list) print(final_list)
运行输出:
[[3, 4, 5], [20, 21, 22, 23], [47, 48]]
逻辑说明
- 全程只遍历列表1次,时间复杂度O(n),没有重复扫描
- 每次判断当前元素和当前子序列最后一个元素的差值,差值为1就追加,否则就结算当前子序列
- 只有长度>=2的连续子序列才会被加入最终结果,完全匹配需求
内容的提问来源于stack exchange,提问作者Hammad
相关产品推荐
相关产品推荐

