Python的bisect模块,用于维护有序列表。bisect模块实现了将元素插入一个有序序列的算法,它利用二分算法实现排序,相比于每次调用sort而言,这样无疑要高效许多。bisect_*系列方法用于求索引,insort_*系列方法用于有序插入

1. 常用方法

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

a是一个有序列表,x是插入其中的元素, lo和hi分别代表列表的切片索引(默认为0和列表长度)

此方法用于寻找一个保证插入元素后列表仍然有序的索引值。当元素x插入a列表后列表仍保持有序状态,且当列表内已经有与x值相同的元素时,x会插入到其中所有相同元素的最左边,方法会返回所插入元素在列表中的索引,并保证在索引值左边的元素都比所插入元素小,右边的都不比所插入元素大(大于等于)

import bisect

if __name__ == '__main__':

l = [1, 2, 3, 4]

k = []

print(bisect.bisect_left(l, 3))

print(bisect.bisect_left(k, 2))

>>> 2

>>> 0

II. bisect.bisect_right、bisect.bisect

这两种都方法和bisect_left类似,唯一的区别就是出现相同元素会优先向右边插入,同样是返回索引值。

import bisect

if __name__ == '__main__':

l = [1, 2, 3, 4]

k = [1, 2, 3, 3, 3, 4]

print(bisect.bisect_right(l, 3))

print(bisect.bisect_right(k, 3))

print(bisect.bisect(l, 3))

print(bisect.bisect(k, 3))

>>> 3

>>> 5

>>> 3

>>> 5

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

不破壞 a 的排序的情况下下插入x, 和 a.insert(bisect.bisect_left(a,x, lo, hi), x) 的效果相同。搜寻只需要 O(log n)时间而插入需要很慢的 O(n)时间,这使得插入操作主导了需要花费的时间。

if __name__ == '__main__':

l = [1, 2, 3, 4]

k = [1, 2, 3, 3, 3, 4]

bisect.insort_right(l, 3)

print(l)

l.insert(bisect.bisect_right(l, 3), 3)

print(l)

>>> [1, 2, 3, 3, 4]

>>> [1, 2, 3, 3, 3, 4]

IV. bisect.insort_right(a,x, lo=0, hi=len(a))、 bisect.insort(a, x,lo=0, hi=len(a))

与insort_left用法类似,区别在于对于重复的值会执行右插,插入的位置在所有a列表中的x的后面(右边)

if __name__ == '__main__':

l = [1, 2, 3, 4]

k = [1, 2, 3, 3, 3, 4]

bisect.insort_right(l, 3)

print(l)

l.insert(bisect.bisect_right(l, 3), 3)

print(l)

>>> [1, 2, 3, 3, 4]

>>> [1, 2, 3, 3, 3, 4]

2. 二分查找

前文说到过二分查找,二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。每次查询会将表分为两部分,然后对于符合要求的那一部分继续执行同上所述的查找流程,直至无法再细分子表。

I.表必须采用顺序存储结构

II.必须按关键字大小有序排列

我们也可以自己来实现一下二分查找方法,虽然效率上会低于bisect

I. 循环实现

def binary_search_by_cycle(lst, item, start, end):

while start <= end:

mid = (start + end) // 2

if lst[mid] == item:

return mid

elif lst[mid] < item:

start = mid + 1

else:

end = mid - 1

return None

if __name__ == '__main__':

l = [i for i in range(1, 10000, 2)]

print(binary_search_by_cycle(l, 9979, 0, len(l)))

>>> 4989

II. 递归实现

def binary_search_by_recursion(lst, item, start, end):

if start > end:

return None

mid = (start + end) // 2

if lst[mid] < item:

return binary_search_by_recursion(lst, item, mid+1, end)

elif lst[mid] > item:

return binary_search_by_recursion(lst, item, start, mid-1)

else:

return mid

if __name__ == '__main__':

l = [i for i in range(1, 10000, 2)]

print(binary_search_by_recursion(l, 9979, 0, len(l)))

>>> 4989

python bisect_python bisect相关推荐

  1. python bisect_python bisect模块

    如果在插入新元素的同时还想保持有序序列的顺序, 那么需要用到 bisect.insort. bisect.bisect 的作用则是快速查找. 今天同事说到了一个python的排序模块bisect,觉得 ...

  2. python bisect_python中bisect模块用法实例

    本文实例讲述了python中bisect模块用法,分享给大家供大家参考. 具体方法分析如下: 这个模块只有几个函数,一旦决定使用二分搜索时,立马要想到使用这个模块. 示例代码如下: import bi ...

  3. python bisect_Python中bisect的用法及示例详解

    bisect是python内置模块,用于有序序列的插入和查找. 查找: bisect(array, item) 插入: insort(array,item) 查找 import bisect a = ...

  4. python bisect_Python中bisect的使用

    在中第十章的练习中,涉及到了分半查找的bisect模块.为此,在网上查阅了Python中bisect模块的相关内容.有几个链接相对权威和明白: 这里,就我有疑问的地方做个记录: 第一,bisect模块 ...

  5. python bisect_Python中bisect的用法

    分析如下: 一般来说,Python中的bisect用于操作排序的数组,比如你可以在向一个数组插入数据的同时进行排序.下面的代码演示了如何进行操作:import bisect import random ...

  6. python bisect_Python 中的bisect

    Python 中的bisect用于操作排序的数组,比如你可以在向一个数组插入数据的同时进行排序.下面的代码演示了如何进行操作: import bisect import random random.s ...

  7. python bisect_Python的bisect模块

    Python的列表(list)类型内部是一个线性表,在线性表中查找元素复杂度为O(N),即调用list.index()的复杂的是O(N).当数据量较大时,应该使用二分查找优化,二分查找范围每次缩小一般 ...

  8. python bisect_Python实现二分查找与bisect模块详解

    前言 其实Python 的列表(list)内部实现是一个数组,也就是一个线性表.在列表中查找元素可以使用 list.index()方法,其时间复杂度为O(n) .对于大数据量,则可以用二分查找进行优化 ...

  9. python使用方法-Python中bisect的使用方法

    Python中列表(list)的实现其实是一个数组,当要查找某一个元素的时候时间复杂度是O(n),使用list.index()方法,但是随着数据量的上升,list.index()的性能也逐步下降,所以 ...

最新文章

  1. 修改cpu型号重启不变_猫头鹰展示D系列新款140毫米CPU散热器:更大散热片,能压400瓦...
  2. 用物理学突破深度学习理论瓶颈? Google-斯坦福发布《深度学习统计力学》综述论文,30页pdf阐述深度学习成功机制...
  3. js中父窗口获得模态窗口的返回值
  4. YbtOJ#20063-[NOIP2020模拟赛B组Day4]古老谜题【统计】
  5. struts2的namespace的问题
  6. Kafka:集群部署
  7. JavaScript中的arguments对象
  8. 计算机211学校四川,四川省有哪些211大学?附排名
  9. bin和sbin区别
  10. 使用plsql管理oracle数据库连接,使用PLSQL连接远程oracle数据库
  11. velocity语法
  12. 大疆文档(2)-指南
  13. 机器学习之BP算法推导
  14. mac 设置maven环境变量并永久生效
  15. 一个链接,让你的网站访客直接和你qq聊天
  16. 完整版 :数据分析师的一天
  17. CSS入门(CSS常用属性----字体、对齐方式、display属性、浮动)
  18. Emscripten中的虚拟文件系统
  19. Unity获取物体下的子物体
  20. 如何在GooglePlay上下载收费应用(APP)

热门文章

  1. Ant命令详解和build.xml
  2. 微信小程序的npm使用心得
  3. react-native:require含义
  4. [python][pydub]mp4转换mp3
  5. marquee 跑马灯
  6. Vue Tooltip封装全局问号提示组件
  7. qt 仿QQ音乐简易本地播放器
  8. 即将消失的原始美味 陕南椴木木耳_陕南赤子_新浪博客
  9. 游戏服务器架构与性能优化相关的一些问题
  10. 面试官:聊聊你知道的跨域解决方案