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

如何在Python中删除存在重叠的嵌套列表?

移除重叠子列表的Python实现问题

我想要编写一段Python代码来移除存在重叠的子列表。这些子列表格式为[lower_bound, upper_bound, data, data],存储在一个大列表中,目标是遍历大列表并移除所有边界存在重叠的子列表。以下是我当前的实现代码:

def cut_overlapping_ranges(ranges):

  keep_ranges = []
  temp_ranges = ranges

  for range_1 in temp_ranges:
    keep_ranges.append(range_1)
    for range_2 in temp_ranges:
      if range_1 != range_2:
        if ((range_1[0] < range_2[0] < range_1[1]) or (range_1[0] < range_2[1] < range_1[1])):
          temp_ranges.remove(range_2)
  return

当前代码的问题

  • 遍历中修改列表引发异常:temp_ranges = ranges是对原列表的引用,遍历过程中调用remove会改变列表长度,导致遍历跳过元素或报错
  • 重叠判断逻辑不全:仅判断了range_2的边界落在range_1内部的情况,没覆盖range_2完全包含range_1、区间端点重合等场景
  • 函数无有效返回:最后return未返回keep_ranges,调用函数无法得到结果
  • 逻辑混乱:添加range_1到保留列表后就删除其他重叠项,但未考虑range_1本身可能和已保留的子列表重叠

正确实现方案

处理重叠区间的高效方式是先排序,再线性遍历保留不重叠项:

def cut_overlapping_ranges(ranges):
    # 按左边界升序排序,确保处理顺序有序
    sorted_ranges = sorted(ranges, key=lambda x: x[0])
    keep_ranges = []
    
    for current in sorted_ranges:
        # 保留列表为空,或当前区间左边界 >= 最后一个保留区间的右边界,说明无重叠
        if not keep_ranges or current[0] >= keep_ranges[-1][1]:
            keep_ranges.append(current)
    
    return keep_ranges

实现说明

  • 排序后只需和最后一个保留的区间比较,因为前面的区间左边界更小且不重叠,只要当前区间左边界不小于最后一个的右边界,就不会和任何已保留区间重叠
  • 时间复杂度由排序主导,为O(n log n),比嵌套循环的O(n²)效率更高
  • 完整覆盖所有不重叠判断场景,若需要排除端点重合,只需把>=改成>

内容的提问来源于stack exchange,提问作者Feynman Cox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:27:37