You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)]

代码说明

  1. 先处理空列表的边界情况,直接返回空列表。
  2. 初始化current_start和current_end为列表第一个元素,代表当前组的起始与结束值。
  3. 从第二个元素开始遍历:
    • 若当前元素与current_start的差值超过limit,则结束当前组,将对应的range加入结果,同时以当前元素为起点开启新组。
    • 若差值未超过limit,则更新当前组的结束值为当前元素(因列表升序,当前元素必然大于之前的结束值)。
  4. 遍历结束后,将最后一个组的range加入结果。

内容的提问来源于stack exchange,提问作者MrChadMWood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:48:14