Python数据结构与算法(8)---维护有序列表bisect

前言

bisect实现了一个算法来向列表中插入元素,同时仍保持列表有序。

本篇,将详细介绍bisect库高效率的玩转列表。

有序插入

首先,我们来看看bisect库是如何实现列表的拆入的。具体代码如下所示:

import bisect

a = [7, 5, 4, 1, 9, 8, 2, 3, 6, 0, 5]
print(a)
new_a = []
for i in a:
    position = bisect.bisect(new_a, i)
    bisect.insort(new_a, i)
    print(position, new_a)

运行之后,效果如下:
有序插入

可以看到,bisect会自动排序进行插入,position为插入的索引位置。当然,对于此类插入如果直接构建列表,然后排序,可能速度更快。不过这只仅仅对于短列表而言非常的快,对于非常长的列表而言,使用上面这种插入排序方式可以大大节省时间和内存,尤其是比较两个列表成员的操作需要开销很大的计算量时。

重复值处理

在实际的列表处理中,我们可能处理重复的值。如前文所示,多余的5是默认插入到重复值右边的,也就是说相当于使用insort_right()函数。同理,那么左边我们就可以用insort_left()函数。

import bisect

a = [7, 5, 4, 1, 9, 8, 2, 3, 6, 0, 5]
print(a)
new_a = []
for i in a:
    position = bisect.bisect_left(new_a, i)
    bisect.insort_left(new_a, i)
    print(position, new_a)

运行之后,效果如下:
重复值处理

读者可以对比一下上面两个图片,最后一行的索引变化。可以看到,一个是6,一个是5,因为我们主动变更,把重复值默认插入到左边了。

  • 5
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:酷酷鲨 设计师:CSDN官方博客 返回首页
评论 3

打赏作者

李元静

您的鼓励就是我创作的动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值