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
相关产品推荐
相关产品推荐

