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
相关产品推荐
相关产品推荐

