如何用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'
实现思路
核心逻辑是跟踪当前趋势状态,只允许一次从下降到上升的切换,切换后不能再出现下降趋势:
- 处理边界情况:列表长度小于3时,直接返回'OK'(无法形成反复趋势)
- 初始化状态:默认处于下降趋势,标记是否已完成趋势切换
- 遍历相邻元素逐个比较:
- 若当前是下降趋势,遇到上升时切换状态并标记已完成切换
- 若已切换到上升趋势,再出现下降则直接判定为'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
相关产品推荐
相关产品推荐

