简介:bisect模块提供对维护一个已排序列表而无须在每次插入后对该列表重排序的支持。对于具有大量条目需要大量比较运算的长列表,这改进了原来的线性搜索或频繁重排序。之所以被命名为 bisect 是因为它使用了基本的二分算法来完成任务。 不同于其他搜索特定值的二分算法工具,本模块的函数被设计为定位一个插入点。
加粗样式参数方法解析:
1、bisect.bisect_left(a, x, lo=0, hi=len(a), *, key=None):在 a 中找到 x 合适的插入点以维持有序。参数 lo 和 hi 可以被用于确定需要考虑的子集;默认情况下整个列表都会被使用。如果 x 已经在 a 里存在,那么插入点会在已存在元素之前(也就是左边)。如果 a 是列表(list)的话,返回值是可以被放在 list.insert() 的第一个参数的。
*2、bisect.bisect_right(a, x, lo=0, hi=len(a), , key=None)
3、bisect.bisect(a, x, lo=0, hi=len(a), *, key=None):类似于 bisect_left(),但是返回的插入点是在 a 中任何现有条目 x 之后(即其右侧)。
4、bisect.insort_left(a, x, lo=0, hi=len(a), *, key=None):按照已排序顺序将 x 插入到 a 中。此函数会先运行 bisect_left() 来定位一个插入点。 然后,它会在 a 上运行 insert() 方法在适当的位置插入 x 以保持排序顺序。
*5、bisect.insort_right(a, x, lo=0, hi=len(a), , key=None)
6、bisect.insort(a, x, lo=0, hi=len(a), *, key=None):类似于 insort_left(),但是会把 x 插入到 a 中任何现有条目 x 之后。此函数会先运行 bisect_right() 来定位一个插入点。 然后,它会在 a 上运行 insert() 方法在适当的位置插入 x 以保持排序顺序。
历史攻略:
数据结构与算法Python版:计数排序
数据结构与算法Python版:基数排序
案例源码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# time: 2024/02/03 16:58
# file: test.py
# author: tom
# 微信公众号: 玩转测试开发
import bisect
def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
# 根据一组有序的数字划分点来查找考试成绩对应的字母等级: (如) 90 及以上为 'A',80 至 89 为 'B',依此类推:
i = bisect.bisect(breakpoints, score)
return grades[i]
if __name__ == '__main__':
# Case1
r = [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]
print(r) # ['F', 'A', 'C', 'C', 'B', 'A', 'A']
# Case2
case2 = [1, 2, 3, 4, 5]
bisect.bisect_left(case2, 3) # x=3 index=2
bisect.insort_left(case2, 2.5) # insort_left >> [1, 2, 2.5, 3, 4, 5]
print(case2)
bisect.insort_right(case2, 3.5) # x=3.5 右侧最近的元素是4, 其位置 index=3
print(case2) # insort_right >> [1, 2, 2.5, 3, 3.5, 4, 5]
运行结果: