Python3 维护有序列表bisect的使用

 更新时间:2025年01月08日 11:05:02   作者:言之。  
Python3中的bisect模块提供了一种高效的方式来在有序列表中进行二分查找和插入操作,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下

在Python 3中,bisect模块提供了用于维护有序列表的函数,主要用于在有序序列中进行二分查找以及插入操作,以下是其常见用法的介绍:

1. 导入模块

首先需要导入bisect模块:

import bisect

2. 主要函数及用法

bisect.bisect_left(a, x, lo=0, hi=None)

功能:在有序列表 a 中查找 x 应该插入的位置,以保持列表的有序性。如果列表 a 中存在与 x 相等的元素,那么返回该元素左侧的插入点。

参数

  • a:有序列表,可以是列表(list)等可迭代的有序序列。
  • x:要插入的元素。
  • lo:可选参数,指定查找范围的起始索引,默认为0。
  • hi:可选参数,指定查找范围的结束索引,默认为列表 a 的长度。

示例

a = [1, 2, 4, 4, 6]
x = 4
position = bisect.bisect_left(a, x)
print(position)  
# 输出: 2,因为4应该插入在索引为2的位置(即第三个元素之前),以保持列表有序

bisect.bisect_right(a, x, lo=0, hi=None) (也可简写成bisect.bisect(a, x, lo=0, hi=None))

  • 功能:同样是在有序列表 a 中查找 x 应该插入的位置以保持列表有序,但如果列表 a 中存在与 x 相等的元素,返回该元素右侧的插入点。
  • 参数:与 bisect.bisect_left 的参数含义相同。

示例

a = [1, 2, 4, 4, 6]
x = 4
position = bisect.bisect_right(a, x)
print(position)  
# 输出: 4,因为4应该插入在索引为4的位置(即第四个元素之后),以保持列表有序

bisect.insort_left(a, x, lo=0, hi=None)

  • 功能:在有序列表 a 中找到 x 的插入点(使用 bisect.bisect_left 的规则),然后将 x 插入到该位置,使得列表 a 仍然保持有序。
  • 参数:与 bisect.bisect_left 的参数含义相同。

示例

a = [1, 2, 4, 6]
x = 4
bisect.insort_left(a, x)
print(a)  
# 输出: [1, 2, 4, 4, 6],4被插入到了合适的位置,保持了列表的有序性

bisect.insort_right(a, x, lo=0, hi=None) (也可简写成bisect.insort(a, x, lo=0, hi=None))

  • 功能:在有序列表 a 中找到 x 的插入点(使用 bisect.bisect_right 的规则),然后将 x 插入到该位置,使得列表 a 仍然保持有序。
  • 参数:与 bisect.bisect_right 的参数含义相同。
  • 示例
a = [1, 2, 4, 6]
x = 4
bisect.insort_right(a, x)
print(a)  
# 输出: [1, 2, 4, 4, 6],这里虽然结果和insort_left插入4的结果一样,但插入逻辑不同,当列表中有多个相等元素时会有区别

3. 应用场景

  • 维护有序数据集:当你需要不断地向一个有序的数据集中添加新元素,同时要保证数据集始终有序时,bisect模块的函数就非常有用。例如,在实现一个动态维护的排行榜功能时,每次有新的成绩加入,都可以使用 bisect.insort 函数将其插入到合适的位置。
  • 二分查找近似值:如果不需要精确查找一个元素,而是想找到最接近它的已存在元素的位置,bisect函数可以通过查找插入点来间接实现这个目的。比如在一个有序的温度记录列表中,查找给定温度值最接近的已记录温度的位置。

到此这篇关于Python3 维护有序列表bisect的使用的文章就介绍到这了,更多相关Python3 有序列表bisect内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • django中账号密码验证登陆功能的实现方法

    django中账号密码验证登陆功能的实现方法

    这篇文章主要介绍了django中账号密码验证登陆功能的实现方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 使用Python模块进行数据处理的详细步骤

    使用Python模块进行数据处理的详细步骤

    Python 提供了丰富的模块和库,用于处理各种类型的数据,本文介绍了一些常用的模块和库,以及如何使用它们进行数据处理的详细步骤和代码示例,对我们的学习或工作有一定的帮助,需要的朋友可以参考下
    2025-02-02
  • python基于watchdog库全自动化监控目录文件

    python基于watchdog库全自动化监控目录文件

    这篇文章主要介绍了python基于watchdog库全自动化监控目录文件,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • 500行代码使用python写个微信小游戏飞机大战游戏

    500行代码使用python写个微信小游戏飞机大战游戏

    这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • 浅析Python中的多重继承

    浅析Python中的多重继承

    这篇文章主要介绍了Python中的多重继承,是Python学习中的基本知识,代码基于Python2.x版本,需要的朋友可以参考下
    2015-04-04
  • Python脚本实现DNSPod DNS动态解析域名

    Python脚本实现DNSPod DNS动态解析域名

    这篇文章主要介绍了Python脚本实现DNSPod DNS动态解析域名,本文直接给出实现代码,需要的朋友可以参考下
    2015-02-02
  • pytorch模型的保存和加载、checkpoint操作

    pytorch模型的保存和加载、checkpoint操作

    这篇文章主要介绍了pytorch模型的保存和加载、checkpoint操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • python生成二维码的实例详解

    python生成二维码的实例详解

    这篇文章主要介绍了python生成二维码的实例详解的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • 使用Python实现ELT统计多个服务器下所有数据表信息

    使用Python实现ELT统计多个服务器下所有数据表信息

    这篇文章主要介绍了使用Python实现ELT统计多个服务器下所有数据表信息,ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程,需要的朋友可以参考下
    2023-07-07
  • 通过Python实现Payload分离免杀过程详解

    通过Python实现Payload分离免杀过程详解

    这篇文章主要介绍了通过Python实现Payload分离免杀过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论