如何根据阈值分割列表?子列表极值差固定为9的自动分割方案
自动按差值阈值分割列表的实现方案
嘿,这个需求很清晰!咱们可以用一个简单的迭代逻辑来实现,核心就是动态跟踪当前子列表的最小/最大值,只要新元素加入后会导致子列表的最大值与最小值之差超过9,就自动新建一个子列表,完全不用手动指定分割数值。
实现代码(Python)
下面是一个健壮性不错的函数,不管你的列表是递增还是无序,都能正确处理:
def split_list_by_threshold(lst, threshold=9): if not lst: return [] result = [] # 初始化第一个子列表及其最小、最大值 current_sublist = [lst[0]] current_min = lst[0] current_max = lst[0] for num in lst[1:]: # 计算加入当前元素后的新极值 new_min = min(current_min, num) new_max = max(current_max, num) if new_max - new_min <= threshold: # 差值符合要求,加入当前子列表并更新极值 current_sublist.append(num) current_min = new_min current_max = new_max else: # 差值超过阈值,保存当前子列表并新建子列表 result.append(current_sublist) current_sublist = [num] current_min = num current_max = num # 别忘了把最后一个子列表加入结果 result.append(current_sublist) return result
逻辑解释
这个函数的思路非常直观:
- 先处理空列表的边界情况,避免运行报错
- 从列表第一个元素开始,初始化第一个子列表,并记录它的最小和最大值
- 逐个遍历后续元素:
- 先预判加入当前元素后,子列表的新极值差是否符合要求
- 如果符合,就把元素加入当前子列表,更新极值
- 如果不符合,就把当前子列表存入结果集,然后以当前元素为起点新建子列表
- 遍历结束后,把最后一个未保存的子列表加入结果
测试你的示例列表
把你的列表传入这个函数,得到的结果如下:
your_list = [66.8344897031784, 68.30329954624176, 78.08724462985992, 107.26053655147552, 107.44138896465302, 109.66499030590057, 171.51213765144348, 172.01367378234863, 173.17001342773438, 343.152220249176, 343.6864709854126, 346.3593053817749, 366.87140941619873, 372.18000888824463, 376.73717975616455, 431.0921788215637, 431.4517140388489, 431.8779182434082, 500.0079822540283, 500.45250415802, 503.12490463256836] print(split_list_by_threshold(your_list))
输出结果:
[ [66.8344897031784, 68.30329954624176], [78.08724462985992], [107.26053655147552, 107.44138896465302, 109.66499030590057], [171.51213765144348, 172.01367378234863, 173.17001342773438], [343.152220249176, 343.6864709854126, 346.3593053817749], [366.87140941619873, 372.18000888824463], [376.73717975616455], [431.0921788215637, 431.4517140388489, 431.8779182434082], [500.0079822540283, 500.45250415802, 503.12490463256836] ]
完全符合你的预期:第一个子列表到68.3就停止,因为下一个元素78.0和66.8的差超过了9,自动新建子列表;后续的每个子列表都严格满足最大值与最小值之差≤9的要求。
内容的提问来源于stack exchange,提问作者afeyzadogan
相关产品推荐
相关产品推荐

