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--维护一个有序的列表的主要内容,如果未能解决你的问题,请参考以下文章

bisect--维护一个有序的列表

Python3标准库:bisect维护有序列表

855. Exam Room

二分插入bisect

Python中bisect的使用方法

二分查找与 bisect 模块