在Python列表中提取正值区间的局部最大值及其对应索引
连续正值分段最大值及对应索引提取问题修复
问题背景
需求为处理大型数据集,仅考虑正值:将列表拆分为连续正值分段,提取每段的最大值及其在原列表中的索引。测试数据示例:
test_data = [2, 35, -45, 56, 5, 67, 21, 320, 55, -140, -45, -98, -23, -23, 35, 67, 34, -30, -86, 4, -93, 35, 88, 32, 98, -6]
用户提供的代码可正确获取各分段最大值,但索引返回空列表,调用结果为:([35, 320, 67, 4, 98], [[], [], [], [], []])
原代码如下:
def global_peaks(test_data): counter1 = [] index = [] global_peak = [] global_idx = [] for idx, data in enumerate(test_data): if data > 0: counter1.append(data) index.append(idx) else: if(len(counter1) != 0): global_peak.append(max(counter1)) index.append(idx) global_idx.append(index) counter1.clear() index.clear() return global_peak, global_idx
问题分析
- 列表为引用类型,
global_idx.append(index)后执行index.clear(),会清空已添加到global_idx中的引用内容,导致最终索引列表为空。 - 错误将负值的索引加入
index列表,且未定位到分段最大值对应的正确索引。 - 未处理列表末尾可能存在的连续正值分段(循环结束后未触发else分支逻辑)。
修正后的代码
def global_peaks(test_data): counter1 = [] index = [] global_peak = [] global_idx = [] for idx, data in enumerate(test_data): if data > 0: counter1.append(data) index.append(idx) else: if counter1: # 定位当前分段最大值对应的原索引 max_val = max(counter1) max_pos = counter1.index(max_val) global_peak.append(max_val) global_idx.append(index[max_pos]) # 清空临时列表,准备处理下一段 counter1.clear() index.clear() # 处理列表末尾未触发else分支的连续正值分段 if counter1: max_val = max(counter1) max_pos = counter1.index(max_val) global_peak.append(max_val) global_idx.append(index[max_pos]) return global_peak, global_idx
修正说明
- 分段结束时,先找到最大值在临时数值列表中的位置,再从临时索引列表中取出对应的原索引,避免引用清空导致的空列表问题。
- 仅保留分段最大值的原索引,不再添加负值索引。
- 增加循环结束后的检查逻辑,避免遗漏末尾的连续正值分段。
测试结果
调用修正后的代码,返回结果为:([35, 320, 67, 4, 98], [1, 7, 15, 19, 24])
每个最大值均对应原列表中的正确索引,符合需求。
内容的提问来源于stack exchange,提问作者ujku80
相关产品推荐
相关产品推荐

