当前位置: 首页 > news >正文

Python bisect 库详细介绍

Python bisect 库详细介绍

bisect 是 Python 标准库中的一个模块,提供了基于二分查找算法的工具,用于维护有序列表而不必每次插入后都重新排序。

核心功能

bisect 模块主要用于以下场景:

  • 在有序列表中快速查找元素位置
  • 将元素插入到有序列表的正确位置,保持列表有序

主要函数

查找函数

  1. bisect_left(a, x, lo=0, hi=len(a))
    • 在有序列表 a 中查找 x 的插入位置
    • 返回的位置使得 x 插入后,所有位于该位置左边的元素都 小于 x
    • 如果 x 已存在,则返回最左边的位置
  2. bisect_right(a, x, lo=0, hi=len(a)) (或简写为 bisect)
    • 类似 bisect_left,但当 x 存在时返回最右边的位置+1

插入函数

  1. insort_left(a, x, lo=0, hi=len(a))
    • x 插入到有序列表 a 中,保持顺序
    • x 存在时,插入到最左边
  2. insort_right(a, x, lo=0, hi=len(a)) (或简写为 insort)
    • 类似 insort_left,但当 x 存在时插入到最右边

使用示例

基本查找

import bisectdata = [1, 3, 5, 7, 9]# 查找不存在的元素
print(bisect.bisect_left(data, 4))  # 输出: 2
print(bisect.bisect_right(data, 4)) # 输出: 2# 查找存在的元素
print(bisect.bisect_left(data, 5))  # 输出: 2
print(bisect.bisect_right(data, 5)) # 输出: 3

元素插入

import bisectdata = [1, 3, 5, 7, 9]bisect.insort_left(data, 4)
print(data)  # 输出: [1, 3, 4, 5, 7, 9]bisect.insort_right(data, 5)
print(data)  # 输出: [1, 3, 4, 5, 5, 7, 9]

实际应用案例

案例1:成绩转换

import bisectdef grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):i = bisect.bisect(breakpoints, score)return grades[i]print(grade(65))  # D
print(grade(85))  # B
print(grade(95))  # A

案例2:区间查找

import bisectdef find_range(value, ranges):# ranges 应该是一个已排序的区间起点列表pos = bisect.bisect_right(ranges, value) - 1return pos if pos >= 0 else Noneranges = [0, 10, 20, 30, 40]
print(find_range(15, ranges))  # 输出: 1 (在10-20区间)

高级用法

处理自定义对象

import bisectclass Student:def __init__(self, name, score):self.name = nameself.score = scoredef __lt__(self, other):return self.score < other.scorestudents = [Student('Alice', 85),Student('Bob', 75),Student('Charlie', 90)
]
students.sort()  # 按分数排序# 查找插入位置
new_student = Student('David', 80)
pos = bisect.bisect_left(students, new_student)
students.insert(pos, new_student)for s in students:print(f"{s.name}: {s.score}")

使用 key 函数(Python 3.10+)

import bisectdata = [{'score': 65}, {'score': 75}, {'score': 85}]# 查找 score=80 应该插入的位置
pos = bisect.bisect_left(data, 80, key=lambda x: x['score'])
print(pos)  # 输出: 2

性能特点

  1. 查找效率:O(log n) 时间复杂度,比线性查找 O(n) 高效
  2. 插入效率:O(n) 时间复杂度,因为需要移动元素
  3. 适用场景
    • 列表基本有序,偶尔需要插入新元素
    • 需要频繁查找但相对较少插入的情况

注意事项

  1. 输入列表 必须是有序的,否则结果不可靠
  2. 对于自定义对象,需要确保实现了 __lt__() 方法
  3. Python 3.10+ 支持 key 参数,类似 list.sort()key 参数

bisect 模块是处理有序数据的利器,特别适合那些需要保持数据有序同时又需要高效查找的场景。

http://www.dtcms.com/a/325466.html

相关文章:

  • 【Java基础】你认为Java的优势是什么
  • 【C语言入门级教】函数指针变量
  • 当 WAF 遇上黑客——一次混合式攻击的应急复盘
  • GO学习记录三
  • 5G 非地面网络(NTN)最专业的方案
  • Docker 详解(保姆级安装+配置+使用教程)
  • 【MySQL✨】服务器安装 MySQL 及配置相关操作
  • 零 shot 语义+在线闭环:深度学习让机器人学会“主动”
  • JavaWeb-后端Web实战(IOC + DI)
  • 第八篇:交互入门:鼠标拾取物体
  • TRS(总收益互换)系统架构设计:多市场交易的技术实现分析
  • 网络编程~
  • 套接字技术、视频加载技术、断点续传技术
  • 前端执行上下文(简版)
  • 2025.8.6 图论(1)Solution
  • 大模型提示词工程实践:聊天机器人定制与实践-打造个性化任务助手
  • Oracle 19C 配置TAF
  • 投资光伏怕成本超标?鹧鸪云系统配置最优方案
  • 微算法科技(NASDAQ:MLGO)通过蚁群算法求解资源分配的全局最优解,实现低能耗的区块链资源分配
  • 【深度学习计算性能】03:自动并行
  • Apache Ignite 生产级的线程池关闭工具方法揭秘
  • 【C++】封装哈希表模拟实现unordered_set和unordered_map
  • 【10】微网优联——微网优联 嵌入式技术一面,校招,面试问答记录
  • 【Linux让旧电脑重获新生的奇妙魔法】
  • 【k8s】k8s安装与集群部署脚本
  • Godot ------ 平滑拖动03
  • 量子神经网络:从NISQ困境到逻辑比特革命的破局之路
  • Day 37:早停策略和模型权重的保存
  • C语言指针(四):字符指针、数组指针与函数指针的实战指南
  • Unity大型场景性能优化全攻略:PC与安卓端深度实践 - 场景管理、渲染优化、资源调度 C#