Python 的标准库 bisect 模块
Python 的标准库 bisect
模块提供了一些用于维护已排序序列的高效算法,主要基于二分查找(binary search)实现。它特别适合在需要频繁插入元素并保持序列有序的场景中使用。
下面是 bisect
模块中主要的函数方法及其功能说明:
1. bisect.bisect_left(a, x, lo=0, hi=len(a))
- 功能:在有序序列
a
中查找元素x
应该插入的位置,以保持序列的有序性。如果x
已经存在,则返回最左边的插入位置(即第一个大于或等于x
的位置)。 - 参数:
a
:已排序的序列(通常是列表)。x
:要查找插入位置的元素。lo
:查找范围的起始索引(默认为 0)。hi
:查找范围的结束索引(默认为len(a)
)。
- 返回值:插入位置的索引。
2. bisect.bisect_right(a, x, lo=0, hi=len(a))
或等价于 bisect.bisect(a, x, lo=0, hi=len(a))
- 功能:在有序序列
a
中查找元素x
应该插入的位置,以保持序列的有序性。如果x
已经存在,则返回最右边的插入位置(即第一个大于x
的位置)。 - 参数:与
bisect_left
相同。 - 返回值:插入位置的索引。
注意:
bisect_right
和bisect
是同一个函数,bisect
是bisect_right
的别名。
3. bisect.insort_left(a, x, lo=0, hi=len(a))
- 功能:将元素
x
插入到有序序列a
中,保持序列的有序性。如果x
已经存在,则插入到最左边的位置(即第一个大于或等于x
的位置)。 - 参数:与
bisect_left
相同。 - 返回值:无(直接修改原序列
a
)。
4. bisect.insort_right(a, x, lo=0, hi=len(a))
或等价于 bisect.insort(a, x, lo=0, hi=len(a))
- 功能:将元素
x
插入到有序序列a
中,保持序列的有序性。如果x
已经存在,则插入到最右边的位置(即第一个大于x
的位置)。 - 参数:与
bisect_right
相同。 - 返回值:无(直接修改原序列
a
)。
注意:
insort_right
和insort
是同一个函数,insort
是insort_right
的别名。
使用场景总结
函数 | 用途 | 是否插入元素 | 相同函数别名 |
---|---|---|---|
bisect_left | 查找 x 应插入的最左位置 | 否 | - |
bisect_right / bisect | 查找 x 应插入的最右位置 | 否 | bisect |
insort_left | 插入 x 到最左位置 | 是 | - |
insort_right / insort | 插入 x 到最右位置 | 是 | insort |
示例代码
import bisect# 已排序列表
a = [1, 3, 4, 4, 6, 8]# 查找插入位置
print(bisect.bisect_left(a, 4)) # 输出: 2(第一个 >=4 的位置)
print(bisect.bisect_right(a, 4)) # 输出: 4(第一个 >4 的位置)# 插入元素
bisect.insort_left(a, 4)
print(a) # 输出: [1, 3, 4, 4, 4, 6, 8]bisect.insort_right(a, 4)
print(a) # 输出: [1, 3, 4, 4, 4, 4, 6, 8]
如果你需要更高效地在动态数据中维护有序性(比如频繁插入和查找),bisect
模块是一个非常实用的工具,比每次都重新排序要高效得多。