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将返回插入位置的列表索引号。
-
该函数是告诉你该往哪里插,而非帮你插。
-
bisect.bisect
模块有三个类似的函数:
bisect.bisect
&bisect.bisect_left
&bisect.bisect_right
-
bisect.bisect
是bisect.bisect_right
的别名,所以这俩用哪个都行 -
那
bisect.bisect_right
与bisect.bisect_left
有什么区别?如果在列表a中,发现了与数值m相等的值,那么m该插入相同值的左边还是右边?
- bisect.bisect或bisect.bisect_right 返回相等值 右侧 的位置索引;
- bisect.biset_left 则是返回 左侧 的位置索引。
-
其返回值,可作为 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