You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中查找列表极值:实现动态分段极值对提取的技术需求

我来帮你解决这个问题!核心是先识别出序列里的局部极值点(交替出现的峰和谷),再按顺序把相邻极值点配对,就能生成你要的XA、AB这类分段结构了。

解决思路
  1. 识别局部极值:遍历Values列表,判断每个元素是否是局部最大值(比左右元素都大)或局部最小值(比左右元素都小)。同时处理首尾元素的边界情况(比如第一个元素只需和第二个元素比较)。
  2. 生成极值配对:把识别出的极值点按出现顺序两两组合,用字母标记分段(X、A、B...),输出你需要的XA=[X,A]格式结果。
Python代码实现
def find_extreme_pairs(values, dates):
    if len(values) < 2:
        return []  # 至少需要两个点才能形成有效配对
    
    extremes = []
    total_points = len(values)
    
    # 处理第一个元素:若与第二个元素值不同,判定为极值
    if values[0] != values[1]:
        is_local_max = values[0] > values[1]
        extremes.append( (values[0], dates[0], is_local_max) )
    
    # 处理中间元素:判断是否为局部极大/极小值
    for idx in range(1, total_points - 1):
        prev_val = values[idx-1]
        curr_val = values[idx]
        next_val = values[idx+1]
        
        # 局部最大值判定:比左右都大
        if curr_val > prev_val and curr_val > next_val:
            extremes.append( (curr_val, dates[idx], True) )
        # 局部最小值判定:比左右都小
        elif curr_val < prev_val and curr_val < next_val:
            extremes.append( (curr_val, dates[idx], False) )
    
    # 处理最后一个元素:若与倒数第二个元素值不同,且避免和前一个极值类型重复
    if values[-1] != values[-2]:
        is_local_max = values[-1] > values[-2]
        if not extremes or extremes[-1][2] != is_local_max:
            extremes.append( (values[-1], dates[-1], is_local_max) )
    
    # 生成相邻极值配对,用字母标记分段
    extreme_pairs = []
    segment_labels = ['X', 'A', 'B', 'C', 'D', 'E', 'F', 'G']  # 可按需扩展字母数量
    for i in range(len(extremes) - 1):
        segment_name = f"{segment_labels[i]}{segment_labels[i+1]}"
        pair = [
            (extremes[i][0], extremes[i][1]),
            (extremes[i+1][0], extremes[i+1][1])
        ]
        extreme_pairs.append( (segment_name, pair) )
    
    return extreme_pairs

# 测试你的数据
Values = [1,2,3,4,5,6,8,9,10,9,7,6,5.50,5,6,7,8,10,12,15,14,13.50,12]
Dates = [f"Day{i+1}" for i in range(len(Values))]  # 补全Dates列表与Values长度匹配

# 输出结果
result = find_extreme_pairs(Values, Dates)
for seg_name, seg_pair in result:
    print(f"{seg_name} = {seg_pair}")
代码说明
  • 极值判断逻辑:严格区分局部极大/极小值,避免连续添加同类型极值(比如两个连续的最大值只保留第一个)。
  • 灵活扩展:如果需要调整极值的判定规则(比如允许相等的情况),可以修改代码中的比较运算符(把>改成>=);如果需要更多分段标记,只需扩展segment_labels列表即可。
  • 边界处理:首尾元素单独判断,确保不会遗漏序列两端的极值。

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

火山引擎 最新活动