Python标准库 --- bisect

Standard Module — bisect



简介

​ 这个模块对有序列表十分有用,它可以在插入新数据使列表仍然保持有序。因列表的排序十分费时,这个模块提供了一种很好的方法(bisect.insort)。

这个模块之所以叫做 bisect ,是因为它使用了基本的二分(bisection)算法。它的源代码也可以作为很棒的算法示例,有兴趣的可以自己看一下(其位置在你python安装目录下的lib中)。

该模块包含函数:

* bisect.bisect
* bisect.bisect_left & bisect.bisect_right

* bisect.insort
* bisect.insort_left & bisect.insort_right

这个模块很容易掌握,看起来有六个函数,其实就俩:

bisect(左右)和insort(左右)。你往下看就知道了


一、bisect.bisect

用途:

将数值m插入有序数列a,并保证插入后序列a仍为有序数列,那么m该插入哪里?

使用bisect.bisect将返回插入位置的列表索引号。
  1. 该函数是告诉你该往哪里插而非帮你插

  2. bisect.bisect模块有三个类似的函数:
    bisect.bisect & bisect.bisect_left & bisect.bisect_right

  3. bisect.bisectbisect.bisect_right的别名,所以这俩用哪个都行

  4. bisect.bisect_rightbisect.bisect_left 有什么区别?

    如果在列表a中,发现了与数值m相等的值,那么m该插入相同值的左边还是右边?

    • bisect.bisect或bisect.bisect_right 返回相等值 右侧 的位置索引;
    • bisect.biset_left 则是返回 左侧 的位置索引。
  5. 其返回值,可作为 list.insert() 的参数

参数:

a:  被查找有序数列
x:  待插入的数值
lo: 在有序数列a中的搜索起点,默认值为0
hi: 在有序数列a中的搜索起点,默认值为了len(a)

示例:

>>> a = [1, 3, 4, 5, 6, 7, 9]			# 将数字3插入列表a的话,插入位置应为a中3的左边或右边
									    列表索引为1或2
>>> bisect.bisect(a, 3)
2
>>> bisect.bisect_right(a, 3)			# 刨除所有论据,我直接告诉你:这俩一样的
2

>>> bisect.bisect_left(a, 3)			
1
>>> bisect.bisect(a, 3, lo=3)			# 若是搜索起点超过了m应该插入的位置,则返回搜索起点的索引
3
>>> bisect.bisect(a, 3, lo=5)
5

二、bisect.insort

用途:

将数值m插入有序数列a,返回插入m的a。

​1. 注意: 这个返回了插入后的结果。

​2. bisect.insort模块同样有三个类似的函数:
bisect.insort & bisect.insort_left & bisect.insort_right

​3. bisect.bisect相同:bisect.insort = bisect.insort_right

参数:

同bisect.bisect
a:  被查找有序数列
x:  待插入的数值
lo: 在有序数列a中的搜索起点,默认值为0
hi: 在有序数列a中的搜索起点,默认值为了len(a)

示例:

为方便展示,我们使用3.0来代替3。

>>> 3 == 3.0
True

>>> a = [1, 3, 4, 5, 6, 7, 9]
>>> bisect.insort(a, 3.0)
>>> a
[1, 3, 3.0, 4, 5, 6, 7, 9]

>>> a = [1, 3, 4, 5, 6, 7, 9]
>>> bisect.insort_right(a, 3.0)			# insort_right与insort都是将值3.0插在了3的右边
>>> a
[1, 3, 3.0, 4, 5, 6, 7, 9]

>>> a = [1, 3, 4, 5, 6, 7, 9]
>>> bisect.insort_left(a, 3.0)
>>> a
[1, 3.0, 3, 4, 5, 6, 7, 9]

欢迎关注公众号TechGuy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值