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

Python列表提取各升降段峰值元素问题求助

提取序列中的峰值元素(支持动态添加数值)

问题定义

需要从一个先递增至峰值后骤降、重复此规律的数值序列中,提取满足以下条件的峰值元素:

  • 峰值元素(或连续相同的元素组)被小于自身的数值前后包围;
  • 序列末尾的连续元素组为临时峰值:若后续出现更大的数值,临时峰值更新为该更大值;若后续出现更小的数值,则临时峰值转为确定峰值,同时新的更小值成为新的临时峰值。

解决方案

通过维护分组信息、已确定峰值和临时峰值的类,实现动态处理数值添加并提取峰值的逻辑:

class PeakTracker:
    def __init__(self):
        # 存储连续相同数值的分组,格式为 (数值, 连续次数)
        self.groups = []
        # 存储已确定的峰值
        self.peaks = []
        # 当前临时峰值(序列末尾的数值组)
        self.temporary_peak = None

    def add_value(self, num):
        if not self.groups:
            # 处理第一个数值
            self.groups.append((num, 1))
            self.temporary_peak = num
            return

        last_val, last_count = self.groups[-1]
        if num == last_val:
            # 数值与最后一个分组相同,更新计数
            self.groups[-1] = (last_val, last_count + 1)
            self.temporary_peak = last_val
        else:
            # 新的数值分组,先检查之前的临时峰值是否符合确定峰值条件
            if self.temporary_peak is not None:
                # 获取前一个分组的数值(如果存在)
                prev_group_val = self.groups[-2][0] if len(self.groups) >= 2 else -float('inf')
                # 临时峰值 > 前一个分组数值,且新数值 < 临时峰值 → 转为确定峰值
                if self.temporary_peak > prev_group_val and num < self.temporary_peak:
                    self.peaks.append(self.temporary_peak)
            # 添加新分组
            self.groups.append((num, 1))
            # 更新临时峰值为新分组的数值
            self.temporary_peak = num

    def get_peaks(self):
        # 返回已确定峰值 + 当前临时峰值
        result = self.peaks.copy()
        if self.temporary_peak is not None:
            result.append(self.temporary_peak)
        return result

测试示例

1. 处理初始序列

tracker = PeakTracker()
input_list = [16.5, 20.5, 32.5, 32.5, 33.0, 33.0, 33.0, 33.5, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 41.0, 6.0, 8.5, 6.5, 6.5, 11.0, 14.0, 14.0, 8.5, 12.0, 21.0, 25.0, 25.0, 37.0, 38.0, 38.0, 38.0, 38.0, 38.0, 38.0, 38.0, 38.0, 38.0, 38.0, 38.0, 38.0, 38.0, 38.0]
for num in input_list:
    tracker.add_value(num)

print(tracker.get_peaks())
# 输出: [41.0, 8.5, 14.0, 38.0]

2. 添加更大的数值

tracker.add_value(39.0)
print(tracker.get_peaks())
# 输出: [41.0, 8.5, 14.0, 39.0]

3. 添加更小的数值

tracker.add_value(37.0)
print(tracker.get_peaks())
# 输出: [41.0, 8.5, 14.0, 39.0, 37.0]

内容的提问来源于stack exchange,提问作者Ivo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:09:22