bisect--维护一个有序的列表
Posted traditional
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bisect--维护一个有序的列表相关的知识,希望对你有一定的参考价值。
介绍
bisect模块实现了一个算法来向列表中插入元素,同时仍然保证列表有序
有序插入
import bisect
'''
可以使用bisect.insort向一个列表中插入元素
'''
values = [46, 39, 80, 91, 62, 71, 32, 70, 15, 6]
# 比如我此刻往values里面插入50这个元素
bisect.insort(values, 50)
print(values) # [46, 39, 50, 80, 91, 62, 71, 32, 70, 15, 6]
'''
bisect默认是从小到大的,因此46比50小,39比50小,80比50大,因此插在了39和80之间
至于我们的values本身就是无序的,因此不可能会把values变成有序的。只能找一个左边比要插入的值小,右边比要插入的值大,然后在这个位置把值插进去
'''
# 我们新建一个列表
l = []
for i in values:
bisect.insort(l, i)
print("-"*20)
print(f"{i} {l}")
'''
--------------------
46 [46]
--------------------
39 [39, 46]
--------------------
50 [39, 46, 50]
--------------------
80 [39, 46, 50, 80]
--------------------
91 [39, 46, 50, 80, 91]
--------------------
62 [39, 46, 50, 62, 80, 91]
--------------------
71 [39, 46, 50, 62, 71, 80, 91]
--------------------
32 [32, 39, 46, 50, 62, 71, 80, 91]
--------------------
70 [32, 39, 46, 50, 62, 70, 71, 80, 91]
--------------------
15 [15, 32, 39, 46, 50, 62, 70, 71, 80, 91]
--------------------
6 [6, 15, 32, 39, 46, 50, 62, 70, 71, 80, 91]
'''
'''
这是一个很简单的例子,实际上,对于这种数据量来说,直接构建列表完成完成一次排序可能速度会更快。
不过对于长列表而言,使用类似这样一个插入排序算法可以大大节省时间和内存。
所以bisect维护的是一个有序的序列,如果一个序列已经有序了,我们使用这种方法插入值,比直接插入值再sort的效率更高
'''
处理重复
import bisect
'''
如果插入一个序列中已经出现的值,该怎么办呢?是插在左边呢,还是插在右边呢?
bisect提供了两种做法,bisect.insort_right和bisect.insort_left,从名字也能看出来。
至于bisect.insort默认等于bisect.insort_right,是插在右边的。
这两种方法没有什么区别
'''
# 不过bisect还有一种用法
values = [1, 3, 5, 7, 11]
# 首先我想插入一个元素7,可以使用bisect.insort,但是如果我想获取7这个元素该插在哪个位置,该怎么办呢?
# 可以使用bisect.bisect
print(bisect.bisect(values, 7)) # 4
'''
结果为4,表示我应该插在索引为4的这个地方,原来索引为4的地方是11
所以当7插进去之后,那么11被挤到了后面,因此正好保证有序
同理还有bisect.bisect_left
'''
print(bisect.bisect_left(values, 7)) # 3
'''
得到的结果为3,至于原因,我想不需要再赘述了
bisect.bisect也等价于bisect.bisect_right
'''
以上是关于bisect--维护一个有序的列表的主要内容,如果未能解决你的问题,请参考以下文章