Python实现升序列表按相邻值差>5规则分割为极值子列表
升序数值列表按相邻差值分组实现
需求规则
- 输入始终为升序排列的数值列表
- 相邻数值差值等于5时归为同一分组,差值大于5时断开分组
- 每个分组以
[组内最小值, 组内最大值]的格式存储 - 对应测试用例预期输出:
[[5, 15], [25, 35], [45, 55], [65, 65], [75, 85], [95, 95], [105, 105], [115, 130], [145, 145], [165, 165], [185, 185], [200, 240]]
原有代码问题
你写的while循环实现边界处理有漏洞:
- 末尾分组的判断写在循环内部,遇到列表末尾刚好是连续差值为5的段时,容易出现漏加或者多加的问题
- 单元素列表场景下循环不会执行,直接返回空列表,不符合要求
修正代码
直接用单次遍历的写法,逻辑更清晰,边界覆盖全,运行后直接匹配预期输出:
# 注意这里的输入截断到240,和预期输出对应,如果你需要处理500、505的场景保留这两个元素即可 x = [5,10,15,25,30,35,45,50,55,65,75,80,85,95,105,115,120,125,130,145,165,185,200,205,210,215,220,225,230,235,240] if not x: print([]) else: result = [] current_group_start = x[0] for idx in range(1, len(x)): # 相邻差超过5,结束当前分组 if x[idx] - x[idx-1] > 5: result.append([current_group_start, x[idx-1]]) current_group_start = x[idx] # 补上最后一个分组 result.append([current_group_start, x[-1]]) print(result)
逻辑说明
- 先处理空列表的极端情况,直接返回空
- 初始把第一个元素设为第一个分组的起点,因为列表是升序,分组起点就是组内最小值
- 从第二个元素开始遍历,只要当前元素和前一个元素差大于5,就把之前的分组(起点到前一个元素)存到结果里,然后把当前元素设为新分组的起点
- 遍历完所有元素后,最后一个分组还没存,直接追加到结果即可,分组的终点就是列表最后一个元素,也就是组内最大值
内容的提问来源于stack exchange,提问作者Anant Shukla
相关产品推荐
相关产品推荐

