python 用bisect来管理已排序的序列

Python bisect库的用法:用于有序序列的插入和非逆序系列的二分查找 阅读详情

已排序的序列可以用来进行快速搜索,而标准库的 bisect 模块给我们提供了二分查找算法。bisect.insort 让已排序的序列保持有序

bisect 模块包含两个主要函数,bisect 和 insort,两个函数都利用二分查找算法来在有序序列中查找或插入元素。

用bisect来搜索

bisect(haystack, needle) 在 haystack(干草垛)里搜索 needle(针)的位置,该位置满足的条件是,把 needle 插入这个位置之后,haystack 还能保持升序。也就是在说这个函数返回的位置前面的值,都小于或等于 needle 的值。其中 haystack 必须是一个有序的序列。你可以先用 bisect(haystack, needle) 查找位置 index,再用 haystack.insert(index, needle) 来插入新值。但你也可用 insort 来一步到位,并且后者的速度更快一些。

Python 的高产贡献者 Raymond Hettinger 写了一个排序集合模块(http://code.activestate.com/recipes/577197-sortedcollection/),模块里集成了 bisect 功能,但是比独立的 bisect 更易用。

示例: 利用几个精心挑选的 needle,向我们展示了 bisect 返回的不同位置值。这段代码的输出结果显示在下图中。

# -*- coding: utf-8 -*-
import bisect
import sys

HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, 30]
NEEDLES = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]

ROW_FMT = '{0:2d} @ {1:2d} {2}{0:<2d}'


def demo(bisect_fn):
    for needle in reversed(NEEDLES):
        position = bisect_fn(HAYSTACK, needle)  # 用特定的 bisect 函数来计算元素应该出现的位置。
        offset = position * ' |'  # 利用该位置来算出需要几个分隔符号
        print(ROW_FMT.format(needle, position, offset))  # 把元素和其应该出现的位置打印出来。


if __name__ == '__main__':
    if sys.argv[-1] == 'left':  # 根据命令上最后一个参数来选用 bisect 函数。
        bisect_fn = bisect.bisect_left
    else:
        bisect_fn = bisect.bisect
    print('DEMO:', bisect_fn.__name__)  # 根据命令上最后一个参数来选用 bisect 函数。
    print('haystack ->', ' '.join('%2d' % n for n in HAYSTACK))
    demo(bisect_fn)


每一行以 needle @ position(元素及其应该插入的位置)开始,然后展示了该元素在原序列中的物理位置
在这里插入图片描述
bisect 的表现可以从两个方面来调教。

首先可以用它的两个可选参数——lo 和 hi——来缩小搜寻的范围。lo 的默认值是 0,hi的默认值是序列的长度,即 len() 作用于该序列的返回值。

其次,bisect 函数其实是 bisect_right 函数的别名,后者还有个姊妹函数叫 bisect_left。它们的区别在于,bisect_left 返回的插入位置是原序列中跟被插入元素相等的元素的位置,也就是新元素会被放置于它相等的元素的前面,而 bisect_right 返回的则是跟它相等的元素之后的位置。这个细微的差别可能对于整数序列来讲没什么用,但是对于那些值相等但是形式不同的数据类型来讲,结果就不一样了。比如说虽然 1 == 1.0 的返回值是 True,1 和 1.0其实是两个不同的元素。下图显示的是用 bisect_left 来运行上述示例的结果。

在这里插入图片描述
跟上图对比可以发现,值 1、8、23、29 和 30 的插入位置变成了原序列中这些值的前面

bisect 可以用来建立一个用数字作为索引的查询表格,比如说把分数和成绩对应起来

# 根据一个分数,找到它所对应的成绩
def grade(score):
    breakpoints = [60, 70, 80, 90]
    grades = 'FDCBA'
    i = bisect.bisect(breakpoints, score)
    return grades[i]
 
if __name__ == '__main__':
    print([grade(score) for score in [33, 99, 77, 70, 89, 90, 100]])
    # ['F', 'A', 'C', 'C', 'B', 'A', 'A']

上面示例里的代码来自 bisect 模块的文档(https://docs.python.org/3/library/bisect.html)。文档里列举了一些利用 bisect 的函数,它们可以在很长的有序序列中作为 index 的替代,用来更快地查找一个元素的位置

这些函数不但可以用于查找,还可以用来向序列中插入新元素,下面就来看看它们的用法。

用bisect.insort插入新元素

insort(seq, item) 把变量 item 插入到序列 seq 中,并能保持 seq 的升序顺序。详见示例如下。

# -*- coding: utf-8 -*-
import bisect
import random

SIZE = 7
random.seed(1729)
my_list = []
for i in range(SIZE):
    new_item = random.randrange(SIZE * 2)
    bisect.insort(my_list, new_item)
    print('%2d ->' % new_item, my_list)

在这里插入图片描述
insort 跟 bisect 一样,有 lo 和 hi 两个可选参数用来控制查找的范围。它也有个变体叫insort_left,这个变体在背后用的是 bisect_left。

目前所提到的内容都不仅仅是对列表或者元组有效,还可以应用于几乎所有的序列类型上。有时候因为列表实在是太方便了,所以 Python 程序员可能会过度使用它,反正我知道我犯过这个毛病。而如果你只需要处理数字列表的话,数组可能是个更好的选择。以后就来讨论一些可以替换列表的数据结构。

流畅的python学习笔记(三):数据结构(1) 文章目录概述序列列表推导和生成器表达式列表推导和可读性列表推导同filter和map的比较笛卡尔积生成器表达式元组不仅仅是不可变的列表把元组用作记录元组拆包嵌套元组拆包具名元组切片对对象进行切片给切片赋值待续。。。 概述 本章讨论的内容几乎可以应用到所有的序列类型上,从我们熟悉的list,到 Python 3 中特有的 str 和 bytes。我还会特别提到跟列表、元组、数组以及队列有关的话题。 序列 最重要也最基础的序列类型应该就是列表(list)了。list 是一个可变序列,并且能同时存放不同类型的元 阅读详情

相关推荐

Windows下Maven环境变量配置避坑指南:解决‘mvn‘不被识别问题

本文详细解析了Windows系统中配置Maven环境变量时常见的'mvn'不被识别问题,特别是当系统提示“无法将‘mvn’项识别为cmdlet、函数、脚本文件或可运行程序的名称”时的解决方案。文章从问题根源入手,提供了清晰的配置步骤、深入的排查方法以及针对PowerShell的特殊处理,旨在帮助开发者彻底解决环境变量配置难题,确保Maven命令正常使用。

weixin_28826961的博客 389

bisect()函数、insort()函数 python

bisect库是python中针对有序列表的一个模块,接收已排序列表作为参数。 一.函数介绍 ————1 2 查询 1. bisect.bisect(a,x)(默认等同于bisect.bisect_right()) 参数: a——已排序的列表 x——要插入的元素 返回值: 返回x在a中会被顺序插入的位置。若a中已有一个或多个x,返回的位置在最后一个x之后。 2. bisect.bisect_left(a,x) 参数: a——已排序的列表 x——要插入的元素 返回值: 返回x在a中会被顺序插入的位置。若a中已

weixin_43401055的博客 9565

从零开始:在Unity中使用Dynamic Bone实现角色骨骼自然抖动(以女性角色胸部为例)

本文详细介绍了在Unity中使用Dynamic Bone插件实现角色骨骼自然抖动的完整流程,特别以女性角色胸部为例。从插件导入、骨骼系统基础到Dynamic Bone组件配置和参数调优,提供了全面的技术指导。文章还包含性能优化技巧和常见问题解决方案,帮助开发者快速掌握这一物理效果实现方法。

weixin_28728495的博客 457

Bisect 模块介绍

bisect模块介绍(bisect函数和insort函数)

qq_52242662的博客 985

汽车Bootloader流程

根据ISO14229-1 写的汽车行业 Bootloader流程 1:编程前 → 先读取软硬件版本号 22 F1 XX 软件信息 22 F1 XX 硬件信息 → 进入扩展会话extend diagnostic sessions 功能寻址 10 03 → 编程条件检测routine control:ECU升级条件的判断,如车速,检测车的型号 31 01 02 03 → 关闭DTC检测,(由于很多节点收不到其它节点的报文后会记录DTC故障)功能寻址 85 02 → 关闭诊断通讯(禁止各个节点的应用报...

weixin_41320142的博客 2831

NWD 格式转换 STL 全流程:专业方案与迪威模型网在线转换详解

在3D模型处理中,将NWD文件转换为STL格式是常见的需求,特别是在3D打印和计算机辅助制造等领域。NWD文件由Autodesk开发,主要用于建筑、工程和施工行业,包含丰富的几何图形和材质信息,但因其专有格式和大文件大小,限制了其应用范围。相比之下,STL格式广泛应用于3D打印,仅包含表面几何信息。转换NWD到STL的原因包括拓展模型应用场景和便于模型编辑。转换方法包括使用专业软件如Autodesk Navisworks配合Blender或3ds Max,或使用专门的转换工具如CADExchanger。

技术说明博主 2540

python之模块bisect

import bisect #help(bisect) bi-是二的英语前缀,比如bicycle(两个圆)自行车,bisect在英文中就是动词二分。bisect模块使用前提是已排序好的list。【list能放什么,二分什么(?)。目前已知['a', 'b', 'g']这种也能二分插入】下面就插入、不插入list来讲其中的函数: 1、bisect.insort 基本的insort用于把不重复数值插入数组里,且不会返回插入的位置。 nums = [1, 3, 5, 7...

weixin_45164685的博客 997

手把手教你校准垂起固定翼(VTOL)遥控器与电调:从零到飞的完整流程

本文详细介绍了垂起固定翼(VTOL)遥控器与电调的校准流程,从基础认知到飞行前检查,涵盖遥控器通道配置、电调校准、舵机方向调整等关键步骤。通过图文并茂的指导,帮助无人机爱好者安全完成VTOL调试,确保首飞成功。特别强调多旋翼模式、过渡模式和固定翼模式的设置要点,适合新手和进阶用户参考。

jenkins8butler的博客 357

Python的bisect模块和堆操作

Python的bisect模块和heapq模块分别用来操作有序序列和堆。bisect模块提供了二分查找和插入元素的函数,heapq模块则提供了堆操作的函数。熟练使用这些模块能够提高编码效率,并加深对数据结构和算法的理解。

aobulaien001的博客 234

数据库崩溃恢复机制:REDO日志与UNDO日志详解

在数据库管理系统中,事务的持久性和一致性是至关重要的。为了保证在系统崩溃或发生故障时数据不会丢失,数据库引入了恢复机制。其中,REDO日志和UNDO日志是两种关键的恢复技术。本文将详细描述这两种日志的作用、工作原理以及它们在数据库崩溃恢复中的应用。

My_wife_QBL的博客 1411

详解大端模式和小端模式

详解大端模式和小端模式 一、大端模式和小端模式的起源         关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令

ce123的技术博客 19万+

Python 用bisect管理已排序的序列

Python 用bisect管理已排序的序列原文地址:Python 用bisect管理已排序的序列

wwwcomcn123的专栏 265

全栈拆解华为乾崑 ADS 5:WEWA2.0智能体架构与安全风险场技术、实现多传感器全融合感知与主动安全预判、助力城市NOA/高速领航/全场景无人通行极致落地

华为乾崑ADS 5的核心颠覆性,不在于单一功能的小幅升级,而在于实现了自动驾驶从“工具式辅助驾驶”到“拟人化智能体驾驶”的全栈范式革命。通过WEWA 2.0端云协同AI智能体架构,解决了传统智驾决策僵硬、博弈能力弱、学习效率低的行业痛点;通过行业首发安全风险场技术,将自动驾驶安全体系从被动避险升级为主动预判,直接减半行车风险;通过乾崑OS专属车规系统底座,保障高阶智驾的低时延、高稳定、高可靠运行;通过多传感器超融合感知体系,实现全场景、全天候、无盲区的精细化环境理解。

getusushu的博客 291

Python 序列构成的数组(用bisect来管理已排序的序列)

bisect 模块包含两个主要函数,bisect 和 insort,两个函数都利用二分查找算法来在有序序列中查找或插入元素。

钢铁男儿 651

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

关于python中‘bisect管理已排序序列’记

# 用 bisect 管理已排序的序列 bisect(haystack, needle) 在 haystack(干草垛)里搜索 needle(指针)的位置,该位置满足的条件是,把needle插入这个位置后,haystack 还能保持升序 也就是说在这个函数返回的位置的前面的值,都小于或者等于needle的值,其中haystack必须是一个有序的序列 可以先用bisect查找位置index,再用ha...

Linux_liuge的博客 390

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python内置序列用bisect来管理已排序的序列

Python 用bisect来管理已排序的序列

plairlli的博客 173

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【流畅的python】02-用 bisect 来管理已排序的序列

原创《流畅的python》 bisect 模块包含两个主要函数, bisect 和 insort ,两个函数都利用二分查找算法来在有序序列中查找或插入元素。 并且是稳定排序 在有序序列中用 bisect 查找某个元素的插入位置 import bisect import sys HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, ...

lu13093323120的博客 395

[Python笔记04] 自定义序列类

1.序列类型的分类 2.序列的+、+=、extend和append的区别 # + a = [1, 2] c = a + [3, 4] #需要赋值给一个变量 print(c) # += a += [3,4] #相当于a = a + [3, 4] print(a) a = [1, 2] a += (3, 4) #可以相加元组 print(a) # extend a = [1, 2] a.ex...

wong_faye的博客 353

第2章 序列构成的数组(下)

2.6 序列的增量赋值 +=背后的特殊方法是__iadd__(用于“就地加法”)。但是如果一个类未实现此方法,Python会退一步调用__add__。 在可变序列和不可变序列上的作用如下: &gt;&gt;&gt; l=[1,2,3] &gt;&gt;&gt; id(l) 1554484273544 &gt;&gt;&gt; l*=2 &gt;&gt;&gt; l [1, 2, 3, 1, 2, ...

无夜之凛冬的博客 156

4月22日读书笔记——第二章序列构成的数组(2)

4-22日读书笔记——第二章(2) 2.42.42.4 切片 这个在上一章也提到了,切片操作可能很方便地从一个对象中按顺序的取用元素。 在对seq[start,stop,step]进行求值的同时,python会调用seq.__ getitem__(slice(start,stop,step))的方法。而对于3个参数我们也可以进行省略。python中,无论是切片还是区间,都会忽略最后一个元素,由于...

weixin_42751878的博客 183

记录学习《流畅的python》的一些知识-----元组(1)

今天开始记录我学习《流畅的python》的过程2020.12.26 2020.12.26 元组是一种很强大的可以用作记录来用的数据类型,它的第二个角色则是充当一个不可变的列表。 记录数据: from collections import namedtuple City = namedtuple(‘City’, ‘name country population coordinates’) City._fields LatLong = namedtuple(‘LatLong’, ‘lat long’) delh

liuhaichao666的博客 243

Python——序列构成的视图

数据结构 一、序列构成的数组: 1、1:内置序列类型 容器序列:list、tuple和collections.deque能存放不容类型的数据。 特点:容器序列存放的是他们所包含的任意类型的对象的引用 扁平序列:str、bytes、bytearray、memoryview和array.array只能容纳一种类型 特点:存放的是值而不是引用,扁平序列其实是一段连续的内存空间,更加紧凑。 可变序列:li...

qq_41134008的博客 464

【FluentPython】2 序列构成的数组

第二章 序列构成的数组 Python 用统一的风格去处理序列数据。不管是哪种数据结构,字符串、列表、字节序列、数组、XML 元素,抑或是数据库查询结果,它们都共用一套丰富的操作:迭代、切片、排序,还有拼接。 内置序列类型概览 Python 标准库用 C 实现了丰富的序列类型,列举如下。 容器序列 list、tuple 和 collections.deque 这些序列能存放不同类型的数据。 扁平序列 str、bytes、bytearray、memoryview 和 array.array,这类序列只能

weixin_41545602的博客 269

python (第二章)数据结构

文章目录2.5 对序列使用 +和 ×建立由列表组成的列表2.6序列的增量赋值(+=和×=)关于 +=的谜题补充:extend()方法和+有什么区别呢?2.7 list.sort方法和内置函数sorted(排序)2.8 用bisect来管理已排序的序列2.8.2用bisect.insort插入元素2.9 当列表不是首选时2.9.1 数组2.9.2内存视图2.9.3 NumPy和SciPy2.9.4 ...

Jibert的博客 515

第2章 序列构成的数组

容器序列存放的是它们所包含的任意类型的对象的引用, 包括, , 等.扁平序列存放的是值而不是引用, 是一段连续的内存空间, 包括, , , , 等.可变序列: , , , , 不可变序列: , , 列表推导是构建列表的快捷方式. 通常的原则是, 只用列表推导来创建新的列表, 并且尽量保持简短. map/filter组合不一定比列表推导要快.由列表推导可以生成两个或以上的可迭代类型的笛卡尔积. 如果想要生成其它类型的序列, 可以使用生成器表达式.生成器表达式背后遵守了迭代器协议, 可以逐个地产出元素,

weixin_45141685的博客 330

python自动数据结构_Python 数据结构

Python 数据结构

weixin_39969611的博客 229
上一篇: python list.sort方法和内置函数sorted
下一篇: python 数组和列表的对比
MZP_man
博客等级 码龄8年 188粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值