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

Python实现有序无重复整数列表的连续区间压缩字符串表示

Python实现有序无重复整数列表的连续区间压缩字符串表示

这个需求其实挺常见的,不管是做数据展示还是日志压缩都可能用到。我来给你分享两个优雅的Python实现思路,完美匹配你的要求~

方法一:手动遍历维护区间(逻辑清晰易理解)

核心思路就是一次遍历列表,维护当前连续区间的起始和结束值,遇到非连续的数就把当前区间格式化后存入结果,最后处理剩下的区间。代码如下:

def compress_sorted_list(mylist):
    if not mylist:
        return ""
    
    result = []
    start = end = mylist[0]
    
    for num in mylist[1:]:
        # 检查当前数是否和上一个数连续
        if num == end + 1:
            end = num
        else:
            # 根据区间长度格式化字符串
            if start == end:
                result.append(f"{start},")
            else:
                result.append(f"{start}-{end},")
            # 重置区间起始和结束为当前数
            start = end = num
    
    # 处理最后一个未加入结果的区间
    if start == end:
        result.append(f"{start},")
    else:
        result.append(f"{start}-{end},")
    
    return " ".join(result)

# 测试你的示例列表
mylist = [2, 5, 6, 7, 11, 12, 19, 20, 21, 22, 37, 38, 40]
print(compress_sorted_list(mylist))
# 输出结果:2, 5-7, 11-12, 19-22, 37-38, 40,

代码解释:

  • 先处理空列表的边界情况,避免索引错误
  • 初始化start和end为列表第一个元素,初始区间只有这一个数
  • 从第二个元素开始遍历:
    • 如果当前数是end+1,说明属于同一个连续区间,更新end
    • 否则,把当前区间格式化成字符串加入结果列表,然后重置区间的起止值为当前数
  • 遍历结束后必须处理最后一个区间,因为循环里只会在遇到非连续数时才会存入结果,最后一个区间不会被自动处理
  • 最后用空格连接所有区间字符串,得到你要的格式

方法二:用itertools.groupby简化代码(简洁优雅)

如果你熟悉Python的标准库,用itertools.groupby可以写出更简洁的代码。核心是利用连续数的数值-索引是固定值这个特性来分组:

from itertools import groupby

def compress_with_groupby(mylist):
    if not mylist:
        return ""
    
    result = []
    # 用enumerate获取每个元素的索引和数值,按数值-索引的差值分组
    for _, group in groupby(enumerate(mylist), lambda x: x[1] - x[0]):
        group_items = list(group)
        start = group_items[0][1]
        end = group_items[-1][1]
        # 格式化区间字符串
        if start == end:
            result.append(f"{start},")
        else:
            result.append(f"{start}-{end},")
    
    return " ".join(result)

# 测试示例
print(compress_with_groupby(mylist))
# 同样输出目标字符串:2, 5-7, 11-12, 19-22, 37-38, 40,

代码解释:

  • enumerate(mylist)会生成类似(0,2), (1,5), (2,6)...的元组,包含每个元素的索引和数值
  • lambda x: x[1] - x[0]作为分组的key,连续的数的数值-索引是固定的(比如5、6、7对应的索引是1、2、3,5-1=4,6-2=4,7-3=4),所以会被分到同一组
  • 每个分组的第一个元素的数值就是区间起始,最后一个元素的数值就是区间结束,直接格式化即可

这两种方法都能完美解决你的问题,第一种逻辑清晰适合新手理解,第二种代码简洁适合追求优雅的开发者。

备注:内容来源于stack exchange,提问作者BoarGules

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:14:31