Python:如何高效将整数列表转为差值不超限制的range列表?
解决方案
核心需求:给定升序排列的整数列表 l 和阈值 limit,将列表分组,每组内最大元素与最小元素的差值不超过 limit;每组转换为左闭右开的 range 对象(即从组内最小值到最大值+1),最终返回这些range的列表。
高效单次遍历实现
因为输入列表是升序的,我们只需一次遍历即可完成分组,时间复杂度O(n),空间复杂度O(1)(不计结果存储),代码如下:
def do_something(l, limit): if not l: return [] result = [] current_start = l[0] current_end = l[0] for num in l[1:]: if num - current_start > limit: # 结束当前组,生成对应的range result.append(range(current_start, current_end + 1)) # 开启新组 current_start = num current_end = num else: # 更新当前组的结束值 current_end = num # 处理最后一个未加入结果的组 result.append(range(current_start, current_end + 1)) return result
测试示例:
limit = 100 l = [1, 2, 4, 9, 33, 77, 85, 100, 151, 304, 405, 407, 499] print(do_something(l, limit))
输出结果:
[range(1, 101), range(151, 152), range(304, 305), range(405, 500)]
代码说明
- 先处理空列表的边界情况,直接返回空列表。
- 初始化
current_start和current_end为列表第一个元素,代表当前组的起始与结束值。 - 从第二个元素开始遍历:
- 若当前元素与
current_start的差值超过limit,则结束当前组,将对应的range加入结果,同时以当前元素为起点开启新组。 - 若差值未超过
limit,则更新当前组的结束值为当前元素(因列表升序,当前元素必然大于之前的结束值)。
- 若当前元素与
- 遍历结束后,将最后一个组的range加入结果。
内容的提问来源于stack exchange,提问作者MrChadMWood
相关产品推荐
相关产品推荐

