Python中查找列表极值:实现动态分段极值对提取的技术需求
我来帮你解决这个问题!核心是先识别出序列里的局部极值点(交替出现的峰和谷),再按顺序把相邻极值点配对,就能生成你要的XA、AB这类分段结构了。
解决思路
- 识别局部极值:遍历Values列表,判断每个元素是否是局部最大值(比左右元素都大)或局部最小值(比左右元素都小)。同时处理首尾元素的边界情况(比如第一个元素只需和第二个元素比较)。
- 生成极值配对:把识别出的极值点按出现顺序两两组合,用字母标记分段(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




