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

2.8.1 用bisect来搜索

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

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

示例 2-17 在有序序列中用 bisect 查找某个元素的插入位置

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)
offset = position * ' |'
print(ROW_FMT.format(needle, position, offset)) if __name__ == '__main__':
if sys.argv[-1] == 'left':
bisect_fn = bisect.bisect_left
else:
bisect_fn = bisect.bisect print('DEMO:', bisect_fn.__name__)
print('haystack ->', ' '.join('%2d' % n for n in HAYSTACK))
demo(bisect_fn)

bisect 的表现可以从两个方面来调教:

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

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

2.8.2 用bisect.insort插入新元素

排序很耗时,因此在得到一个有序序列之后,我们最好能够保持它的有序。bisect.insort 就是为了这个而存在的。

insort(seq, item) 把变量 item 插入到序列 seq 中,并能保持 seq的升序顺序。详见示例 2-19 和它在图 2-6 里的输出。

  示例 2-19 insort 可以保持有序序列的顺序

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。

最新文章

  1. Linux下开启关闭SeLinux
  2. CentOS系统启动流程
  3. shiro 自动登录
  4. 在Win8中用批处理创建Oracle数据库时报“Unable to open file”
  5. .frame类库简单介绍与使用
  6. 线程 VS 进程
  7. android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留几个类)
  8. 如何查找MySQL中查询慢的SQL语句
  9. Apache2.2 + php-5.4.45-Win32-VC9-x86 配置
  10. Light oj 1234 - Harmonic Number
  11. iOS6 以上设置文本高度,行高(转)
  12. CentOS 配置Apache+Mysql+PHP (yum)与卸载
  13. Cocoapods 64-bit(iPhone5s) 问题解决方案
  14. redhat6 + 11G DG部署
  15. 【Netty】Netty传输
  16. JavaWeb(一)Servlet中乱码解决与转发和重定向的区别
  17. 学习Javascript数据结构与算法(第2版)笔记(1)
  18. (四)jdk8学习心得之函数式接口
  19. [Ubuntu]Firefox书签Ubuntu与Windows同步
  20. Docker Swarm 配置文件存储

热门文章

  1. Flask-login 例子
  2. 重读APUE(3)-dup与文件表项
  3. 删除顺序表L中下标为p(0&lt;=p&lt;=length-1)的元素,成功返回1,不成功返回0,并将删除元素的值赋给e
  4. Hide()方法不生效
  5. 静态库和动态库的区别和win平台和linux平台代码实现
  6. web前端——Vue.js基础学习之class与样式绑定
  7. Android:cmake开发指南
  8. java引用如果是成员变量则引用本身不保存在栈上的汇编级调试证明
  9. [C++]数据结构:栈之顺序栈
  10. flask上下文管理相关 - threading.local 以及原理剖析