
本文介绍如何遍历数字列表,识别数值下降位置(即前一个数大于后一个数)所对应的前项(“断点前峰值”),并自动追加列表末尾元素,最终生成如 [3, 4, 5, 8] 的精简结果。
在处理有序分段序列(如多次从 1 开始递增的子序列)时,常需提取每个递增段的最大值——这些最大值恰好出现在下一段“重置”(即数值回落)之前,也就是所谓的“断点”。例如,对列表 [1,2,3,1,2,3,4,1,2,3,4,5,1,2,3,4,5,6,7,8],其自然分段为:
[1,2,3] → 3 是本段峰值;
[1,2,3,4] → 4 是本段峰值;
[1,2,3,4,5] → 5 是本段峰值;
[1,2,3,4,5,6,7,8] → 无后续回落,但按需求需保留末尾 8。
因此,核心逻辑是:检测相邻元素对 (a, b) 中满足 a > b 的位置,并收集所有这样的 a;最后将列表最后一个元素追加进去。
Python 3.10+ 提供了 itertools.pairwise,可优雅生成连续二元组,避免手动索引或 zip(lst, lst[1:]) 的冗余写法。以下是推荐实现:
from itertools import pairwise my_list = [1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 7, 8] # 提取所有“断点前的峰值”:即 a > b 时的 a break_points = [a for a, b in pairwise(my_list) if a > b] # 追加末尾元素(确保结果包含最后一个递增段的终点) new_list = break_points + [my_list[-1]] print(new_list) # 输出: [3, 4, 5, 8]
⚠️ 注意事项:
- 切勿使用 list 作为变量名——它会覆盖 Python 内置类型 list,导致后续调用 list() 失败或行为异常;推荐使用 my_list、nums 等语义化名称。
- 若运行环境为 Python
- 此方法假设输入为非空列表;若需健壮性,建议添加 if my_list: 判断。
该方案时间复杂度为 O(n),空间复杂度为 O(k)(k 为断点数量),简洁高效,适用于日志分析、信号峰值检测、分段序列摘要等典型场景。










