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

举报
择城终老 发表于 2021/07/27 00:49:33 2021/07/27
【摘要】 目录 前言有序插入重复值处理 前言 bisect实现了一个算法来向列表中插入元素,同时仍保持列表有序。 本篇,将详细介绍bisect库高效率的玩转列表。 有序插入 首先,我们来看看bisect库是如何实现列表的拆入的。具体代码如下所示: import bisect a = [7, 5, 4, 1, 9, 8, 2, 3, 6, 0, 5] pr...

前言

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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

可以看到,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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

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

文章来源: liyuanjinglyj.blog.csdn.net,作者:李元静,版权归原作者所有,如需转载,请联系作者。

原文链接:liyuanjinglyj.blog.csdn.net/article/details/115836413

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。