Python中如何将有序数字列表按相邻数值间隔拆分为子列表
Python实现已排序列表按间隔拆分的高效方案
核心思路
因为输入已经是有序列表,只需要单次遍历判断相邻元素差值即可完成拆分,不需要额外排序或复杂计算,时间复杂度可达理论最优的O(n)。
实现代码
基础遍历实现(最推荐,兼容性高、无额外依赖)
def split_sorted_list(sorted_list, gap_threshold=3): # 空列表直接返回 if not sorted_list: return [] # 初始化结果,第一个元素先放入第一个子列表 result = [[sorted_list[0]]] for current_num in sorted_list[1:]: last_num_in_group = result[-1][-1] # 差值大于等于阈值就创建新分组 if current_num - last_num_in_group >= gap_threshold: result.append([current_num]) else: result[-1].append(current_num) return result # 测试示例 sample_list = [1,2,4,7,9,10,15,20] print(split_sorted_list(sample_list)) # 输出:[[1, 2, 4], [7, 9, 10], [15], [20]]
基于itertools.groupby的简洁实现
如果偏好函数式写法,可以用Python标准库的groupby实现,本质也为单次遍历:
from itertools import groupby def split_sorted_list(sorted_list, gap_threshold=3): if not sorted_list: return [] prev = sorted_list[0] group_id = 0 def gen_group_id(num): nonlocal prev, group_id if num - prev >= gap_threshold: group_id += 1 prev = num return group_id return [list(group) for _, group in groupby(sorted_list, key=gen_group_id)]
方案优势
- 时间复杂度为O(n):仅遍历一次列表所有元素,是该需求下的理论最优效率
- 空间复杂度为O(1)(除结果存储外):仅使用少量变量记录状态,无多余内存开销
- 可扩展性强:仅需修改
gap_threshold参数即可调整拆分的间隔阈值,适配不同业务规则
内容的提问来源于stack exchange,提问作者mugetsu
相关产品推荐
相关产品推荐

