You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

问题分析

  1. 列表为引用类型,global_idx.append(index)后执行index.clear(),会清空已添加到global_idx中的引用内容,导致最终索引列表为空。
  2. 错误将负值的索引加入index列表,且未定位到分段最大值对应的正确索引。
  3. 未处理列表末尾可能存在的连续正值分段(循环结束后未触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:55:24