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

如何用Python检测列表数据是否符合先降后升的单一趋势

检测Python列表是否符合先降后升的无反复趋势

需求:判断一个数字列表是否符合先持续下降,之后持续上升的单一趋势,不允许出现降-升-降或升-降-升的反复波动。

示例:

a1 = [8,6,4,1,-2,-6,5,8,9,87]  # 符合趋势,输出'OK'
a2 = [8,6,4,1,-2,-6,5,-8,9,10] # 存在反复波动,输出'NG'

实现思路

核心逻辑是跟踪当前趋势状态,只允许一次从下降到上升的切换,切换后不能再出现下降趋势:

  1. 处理边界情况:列表长度小于3时,直接返回'OK'(无法形成反复趋势)
  2. 初始化状态:默认处于下降趋势,标记是否已完成趋势切换
  3. 遍历相邻元素逐个比较:
    • 若当前是下降趋势,遇到上升时切换状态并标记已完成切换
    • 若已切换到上升趋势,再出现下降则直接判定为'NG'
    • 相邻元素相等的情况默认视为符合当前趋势,可根据需求调整规则

代码实现

def check_trend(lst):
    # 边界情况:长度不足3,无法形成反复趋势
    if len(lst) <= 2:
        return 'OK'
    
    has_switched = False
    # 遍历所有相邻元素对
    for i in range(1, len(lst)):
        prev_val = lst[i-1]
        curr_val = lst[i]
        # 当前处于下降阶段
        if prev_val > curr_val:
            # 已经切换到上升后又出现下降,直接返回NG
            if has_switched:
                return 'NG'
        # 当前触发上升趋势
        elif prev_val < curr_val:
            # 第一次切换为上升趋势,标记状态
            if not has_switched:
                has_switched = True
        # 平值情况,不改变当前趋势状态
        else:
            continue
    return 'OK'

# 测试示例
a1 = [8,6,4,1,-2,-6,5,8,9,87]
a2 = [8,6,4,1,-2,-6,5,-8,9,10]
print(check_trend(a1))  # 输出: OK
print(check_trend(a2))  # 输出: NG

严格趋势版本(不允许平值)

如果要求下降阶段必须每个元素都严格小于前一个,上升阶段必须严格大于前一个,可以修改逻辑,把平值直接判定为不符合:

def check_strict_trend(lst):
    if len(lst) <= 2:
        return 'OK'
    
    has_switched = False
    for i in range(1, len(lst)):
        prev_val = lst[i-1]
        curr_val = lst[i]
        if prev_val > curr_val:
            if has_switched:
                return 'NG'
        elif prev_val < curr_val:
            if not has_switched:
                has_switched = True
        else:
            # 出现平值直接返回NG
            return 'NG'
    return 'OK'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:56:07