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

Python标准库 bisect 模块

bisect模块提供了对有序列表进行二分查找和插入的支持。它基于二分算法实现,可以高效地维护有序列表而不必每次插入后都调用排序操作。

主要功能

1. 二分查找函数

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

    • 在有序列表a中查找x的插入位置,返回索引使得x插入后能保持有序
    • 如果x已存在,返回最左侧的位置
    • lo和hi参数可以指定查找范围
    • a: 已排序的列表
    • x: 要插入的值
    • lo (可选): 查找范围的起始索引,默认为0
    • hi (可选): 查找范围的结束索引,默认为列表长度
    • 所有位于该索引之前的元素都小于 x
    • 所有位于该索引之后的元素都大于或等于 x
    • 如果 x 已经在列表中,则返回第一个 x 的位置(最左边的位置)
  • bisect.bisect_right(a, x, lo=0, hi=len(a)) (或bisect.bisect)

    • 类似bisect_left,但如果x已存在,返回最右侧的位置

2. 插入函数

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

    • 将x插入到有序列表a中,保持有序
    • 如果x已存在,插入到最左侧
  • bisect.insort_right(a, x, lo=0, hi=len(a)) (或bisect.insort)

    • 类似insort_left,但如果x已存在,插入到最右侧

示例用法

import bisect# 有序列表
data = [1, 3, 5, 7, 9]# 查找插入位置
index = bisect.bisect_left(data, 4)  # 返回2
print(f"4应该插入到位置{index}")# 实际插入
bisect.insort_left(data, 4)
print(data)  # 输出 [1, 3, 4, 5, 7, 9]# 处理重复元素
data = [1, 3, 3, 3, 5]
print(bisect.bisect_left(data, 3))   # 返回1
print(bisect.bisect_right(data, 3))  # 返回4

性能特点

  • 时间复杂度:O(log n) 对于查找和插入操作
  • 比每次插入后调用sort()更高效(sort()是O(n log n))
  • 适合频繁插入和查找的有序列表场景

实际应用

  1. 成绩分级:
def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):i = bisect.bisect(breakpoints, score)return grades[i]grades = [grade(score) for score in [33, 65, 77, 89, 95]]
# ['F', 'D', 'C', 'B', 'A']
  1. 维护有序列表:
import random# 生成随机数但保持有序
data = []
for _ in range(10):item = random.randint(1, 100)bisect.insort(data, item)
print(data)

bisect模块是处理有序序列时的高效工具,特别适合需要频繁插入和查找的场景。

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

相关文章:

  • 云原生技术与应用-容器技术技术入门与Docker环境部署
  • 【洛谷题单】--顺序结构(一)
  • OSPFv3与OSPFv2不同点
  • eslint扁平化配置
  • Linux守护进程
  • 【ES实战】ES客户端线程量分析
  • java-网络编程
  • Java中数组与链表的性能对比:查询与增删效率分析
  • RabbitMQ第二章(RocketMQ的五大工作模式)
  • 【Linux服务器】-安装ftp与sftp服务
  • 数据结构:数组:合并数组(Merging Arrays)
  • 20 道 Node.js 高频面试题
  • Codeforces Round 868 (Div. 2) D. Unique Palindromes(1900,构造)
  • 深入企业内部的MCP知识(四):FastMCP装饰器与类方法:正确结合面向对象与MCP组件的实践指南
  • 4.权重衰减(weight decay)
  • MySQL-索引
  • SQL135 每个6/7级用户活跃情况
  • ${project.basedir}延申出来的Maven内置的一些常用属性
  • Python入门Day5
  • 嵌入式面试八股文100题(二)
  • 分库分表之实战-sharding-JDBC水平分库+水平分表配置实战
  • 【深度学习入门 鱼书学习笔记(1)感知机】
  • 7月8日学习笔记——统计决策方法
  • 基于springboot的物流配货系统
  • Nuxt.js 静态生成中的跨域问题解决方案
  • C++学习笔记之数组、指针和字符串
  • 【PyTorch】PyTorch中torch.nn模块的激活函数
  • 项目Win系统下可正常获取Header字段,但是到了linux、docker部署后无法获取
  • python基础day08
  • linux wsl2 docker 镜像复用快速方法