Python中基于上下限生成周期子列表列表的实现需求
列表切片:按「低于下限→超过上限」的周期提取首尾元素
问题描述
给定列表:
l = [136.29, 136.67, 136.67, 136.68, 136.38, 136.41, 136.41, 136.43, 136.0, 136.09, 136.1, 136.23, 135.71, 135.9, 135.9, 136.02, 135.73, 135.81, 135.82, 136.19, 135.66, 136.15, 136.16, 136.62, 136.64, 136.66, 135.97, 136.52, 136.52, 136.63, 136.08, 136.48]
设置下限lower = 136.3、上限upper = 136.6,需要按以下规则切片:
- 一个周期从首次低于下限的元素开始,到首次超过上限的元素结束,仅保留该周期的首尾元素
- 下一个周期从再次出现低于下限的元素开始,重复上述逻辑
- 期望输出:
output = [[136.29, 136.67], [136.0, 136.62], [135.97, 136.63]]
解决方案
通过状态机的方式跟踪周期的起始和结束状态,实现精准提取:
l = [136.29, 136.67, 136.67, 136.68, 136.38, 136.41, 136.41, 136.43, 136.0, 136.09, 136.1, 136.23, 135.71, 135.9, 135.9, 136.02, 135.73, 135.81, 135.82, 136.19, 135.66, 136.15, 136.16, 136.62, 136.64, 136.66, 135.97, 136.52, 136.52, 136.63, 136.08, 136.48] lower = 136.3 upper = 136.6 output = [] state = "looking_start" # 两种状态:寻找周期起点/寻找周期终点 current_start = None for num in l: if state == "looking_start": # 找到低于下限的元素,标记为周期起点,切换状态 if num < lower: current_start = num state = "looking_end" elif state == "looking_end": # 找到超过上限的元素,记录首尾对,回到寻找起点状态 if num > upper: output.append([current_start, num]) state = "looking_start" current_start = None print(output)
逻辑说明
- 初始状态为
looking_start,遍历列表寻找第一个低于下限的元素,作为周期起点 - 切换到
looking_end状态后,继续遍历寻找第一个超过上限的元素,作为周期终点 - 将首尾元素组成的子列表加入结果,然后回到寻找下一个周期起点的状态
- 遍历结束后即可得到符合要求的输出结果
内容的提问来源于stack exchange,提问作者tichy
相关产品推荐
相关产品推荐

