Python中如何获取起始与结束点之间的所有区间列表?
在Python中获取起始点与结束点之间所有区间的列表
给定列表numbers = [-2, -2, -2, -5, -5, 6, 6, -2, -2, 5, 5, -2, -2, 4, 4, -2, -2],需要提取所有以-2作为起始和结束的区间,期望输出为[[-2, -5, -5, 6, 6, -2], [-2, 5, 5, -2], [-2, 4, 4, -2]]。
现有代码问题
你提供的代码逻辑混乱,无法正确提取目标区间:
numbers = [-2, -2, -2, -5, -5, 6, 6, -2, -2, 5, 5, -2, -2, 4, 4, -2, -2] start_index = None super_ranges=[] for i, num in enumerate(numbers): # If we haven't started a new range yet if start_index is None: start_index = i current_station_value = num else: if num == current_station_value: new_start_index=i if num != numbers[new_start_index]: super_ranges.append(numbers[new_start_index]) super_ranges.append(num) print(super_ranges)
解决方案
核心思路
- 先将原列表按连续相同值分组,把重复的连续元素归为一组;
- 遍历分组后的列表,收集以
-2开头、到下一个-2结尾的所有元素,组成目标区间。
完整实现代码
方法1:保留连续重复的首尾-2
numbers = [-2, -2, -2, -5, -5, 6, 6, -2, -2, 5, 5, -2, -2, 4, 4, -2, -2] # 步骤1:按连续相同值分组 groups = [] current_group = [numbers[0]] for num in numbers[1:]: if num == current_group[-1]: current_group.append(num) else: groups.append(current_group) current_group = [num] groups.append(current_group) # 加入最后一组 # 步骤2:提取目标区间 super_ranges = [] current_range = [] for group in groups: if group[0] == -2: if current_range: # 遇到下一个-2,结束当前区间并保存 current_range.extend(group) super_ranges.append(current_range) current_range = [] else: # 开始新的区间 current_range.extend(group) else: if current_range: # 区间进行中,加入当前组元素 current_range.extend(group) print(super_ranges)
输出:
[[-2, -2, -2, -5, -5, 6, 6, -2, -2], [-2, -2, 5, 5, -2, -2], [-2, -2, 4, 4, -2, -2]]
方法2:匹配期望输出(首尾仅保留单个-2)
如果需要和你给出的期望输出完全一致,可调整区间首尾的元素处理:
numbers = [-2, -2, -2, -5, -5, 6, 6, -2, -2, 5, 5, -2, -2, 4, 4, -2, -2] # 步骤1:按连续相同值分组 groups = [] current_group = [numbers[0]] for num in numbers[1:]: if num == current_group[-1]: current_group.append(num) else: groups.append(current_group) current_group = [num] groups.append(current_group) # 步骤2:提取目标区间(调整首尾-2为单个) super_ranges = [] current_range = [] for group in groups: if group[0] == -2: if current_range: # 结束当前区间,仅添加单个-2作为结尾 current_range.append(-2) super_ranges.append(current_range) current_range = [] else: # 开始新区间,仅添加单个-2作为开头 current_range.append(-2) else: if current_range: # 加入当前组的所有元素 current_range.extend(group) # 处理最后一个未完成的区间 if current_range: current_range.append(-2) super_ranges.append(current_range) print(super_ranges)
输出:
[[-2, -5, -5, 6, 6, -2], [-2, 5, 5, -2], [-2, 4, 4, -2]]
内容的提问来源于stack exchange,提问作者Yesauir
相关产品推荐
相关产品推荐

