Python:解析数组二分查找算法bisect

本文介绍了Python的bisect模块,包括其提供的bisect_left、bisect_right、insort_left和insort_right等函数,用于在已排序列表中高效地定位插入点并保持排序。通过grade函数实例演示了如何使用这些函数进行成绩等级划分。
摘要由CSDN通过智能技术生成

简介: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]

运行结果:

图片

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值