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
使用场景
-
查找元素的位置:
- 如果你需要在一个有序列表中查找某个值的位置,可以使用
bisect_left或bisect_right。 - 例如,查找某个值是否存在于列表中:
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") -
插入元素保持有序:
- 如果你需要在一个有序列表中插入一个值,同时保持列表的有序性,可以使用
insort_left或insort_right。 - 例如:
import bisect a = [1, 2, 4, 5] x = 3 bisect.insort_left(a, x) print(a) # 输出:[1, 2, 3, 4, 5] -
统计小于等于某个值的元素数量:
- 如果你需要统计有序列表中小于或等于某个值的元素数量,可以使用
bisect_right。 - 例如:
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