Python如何根据列表连续元素的中点构造目标区间列表
Python实现列表相邻元素中点区间分割
不需要写大量if/else分支,用Python内置的序列操作就能简洁实现。
核心逻辑
首先梳理计算规则本质:
- 最终输出的区间总数和原列表长度一致
- 所有区间的端点共
原列表长度+1个:第一个端点是原列表首元素,最后一个端点是原列表尾元素,中间的端点依次是原列表每对相邻元素的中点 - 相邻两个端点组合成一个区间,就是最终需要的结果
中点计算可以简化为两数平均值:(a + b) / 2,和你给出的(b - a)/2 + a计算结果完全一致。
简洁实现代码
版本1:列表推导式写法(最Pythonic)
def get_intervals(arr): # 组装所有分界点 break_points = [arr[0]] + [(a + b) // 2 for a, b in zip(arr, arr[1:])] + [arr[-1]] # 相邻分界点组合为区间 return [[s, e] for s, e in zip(break_points, break_points[1:])] # 测试用例 origin_list = [60, 120, 180, 240, 480] print(get_intervals(origin_list))
运行输出完全匹配预期:
[[60, 90], [90, 150], [150, 210], [210, 360], [360, 480]]
注:如果需要保留浮点结果,把
//(整数除法)换成/即可。
版本2:单次遍历写法(性能更优,适合超长列表)
如果列表长度很大,不想额外生成分界点列表,可以一次遍历完成计算:
def get_intervals(arr): intervals = [] current = arr[0] for num in arr[1:]: mid = (current + num) // 2 intervals.append([current, mid]) current = mid intervals.append([current, arr[-1]]) return intervals
写法优势
- 没有冗余的条件判断分支,逻辑和需求规则完全对齐
- 利用
zip处理相邻元素对,是Python序列操作的通用惯用写法 - 对任意长度≥2的数值列表都能直接适配,不需要额外修改边界逻辑
内容的提问来源于stack exchange,提问作者skywalkerdk
相关产品推荐
相关产品推荐

