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