Python bisect模块详解:bisect_left与insort_left的用法与适用场景

bisect 提供了一系列用于在⭐有序列表中进行二分查找和插入操作的函数。它非常适合处理有序数据,能够高效地完成查找、插入等操作,而不需要手动实现二分查找算法。

1. bisect.bisect_left(a, x, lo=0, hi=len(a))

  • 功能:找到有序列表 a 中第一个大于或等于 x 的位置。
  • 返回值:返回插入位置的索引。如果 x 已经存在于列表中,返回 x 的最左边的位置。
  • 示例
    import bisect
    
    a = [1, 2, 4, 4, 5]
    x = 4
    index = bisect.bisect_left(a, x)
    print(index)  # 输出:2
    
  • 2. bisect.bisect_right(a, x, lo=0, hi=len(a))

  • 功能:找到有序列表 a 中第一个大于 x 的位置。
  • 返回值:返回插入位置的索引。如果 x 已经存在于列表中,返回 x 的最右边的位置的下一个位置。
  • 示例
    import bisect
    
    a = [1, 2, 4, 4, 5]
    x = 4
    index = bisect.bisect_right(a, x)
    print(index)  # 输出:4
    
  • 3. bisect.insort_left(a, x, lo=0, hi=len(a))

  • 功能:将 x 插入到有序列表 a 中,保持列表的有序性。插入位置是第一个大于或等于 x 的位置。
  • 示例
    import bisect
    
    a = [1, 2, 4, 5]
    x = 3
    bisect.insort_left(a, x)
    print(a)  # 输出:[1, 2, 3, 4, 5]
    
  • 4. bisect.insort_right(a, x, lo=0, hi=len(a))

  • 功能:将 x 插入到有序列表 a 中,保持列表的有序性。插入位置是第一个大于 x 的位置。
  • 示例
    import bisect
    
    a = [1, 2, 4, 4, 5]
    x = 4
    bisect.insort_right(a, x)
    print(a)  # 输出:[1, 2, 4, 4, 4, 5]
    
  • 5. bisect.bisect(a, x, lo=0, hi=len(a))

  • 功能:等同于 bisect_right,找到有序列表 a 中第一个大于 x 的位置。
  • 示例
    import bisect
    
    a = [1, 2, 4, 4, 5]
    x = 4
    index = bisect.bisect(a, x)
    print(index)  # 输出:4
    
  • 使用场景

    1. 查找元素的位置

    2. 如果你需要在一个有序列表中查找某个值的位置,可以使用 bisect_leftbisect_right
    3. 例如,查找某个值是否存在于列表中:
      import bisect
      
      a = [1, 2, 4, 4, 5]
      x = 3
      index = bisect.bisect_left(a, x)
      if index != len(a) and a[index] == x:
          print(f"{x} found at index {index}")
      else:
          print(f"{x} not found")
      
    4. 插入元素保持有序

    5. 如果你需要在一个有序列表中插入一个值,同时保持列表的有序性,可以使用 insort_leftinsort_right
    6. 例如:
      import bisect
      
      a = [1, 2, 4, 5]
      x = 3
      bisect.insort_left(a, x)
      print(a)  # 输出:[1, 2, 3, 4, 5]
      
    7. 统计小于等于某个值的元素数量

    8. 如果你需要统计有序列表中小于或等于某个值的元素数量,可以使用 bisect_right
    9. 例如:
      import bisect
      
      a = [1, 2, 4, 4, 5]
      x = 4
      count = bisect.bisect_right(a, x)
      print(f"Number of elements <= {x}: {count}")  # 输出:4
      

    注意事项

  • bisect 模块的函数假设输入的列表是有序的。如果列表未排序,结果可能不正确。
  • 如果需要频繁地插入和查找操作,可以考虑使用其他数据结构(如 sortedcontainers.SortedList),这些数据结构在某些情况下可能更高效。
  • 作者:asdfg1258963

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python bisect模块详解:bisect_left与insort_left的用法与适用场景

    发表回复