bisect实现了一个算法来向列表中插入元素,同时仍保持列表有序。本篇,将详细介绍bisect库高效率的玩转列表。

 Python数据结构与算法—维护有序列表bisect(python数据结构与算法分析豆瓣) Python 数据结构与算法 bisect 第1张

前言

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

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

有序插入

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

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

运行之后,效果如下:

 Python数据结构与算法—维护有序列表bisect(python数据结构与算法分析豆瓣) Python 数据结构与算法 bisect 第2张

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

重复值处理

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

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

运行之后,效果如下:

 Python数据结构与算法—维护有序列表bisect(python数据结构与算法分析豆瓣) Python 数据结构与算法 bisect 第3张

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

转载请说明出处
知优网 » Python数据结构与算法—维护有序列表bisect(python数据结构与算法分析豆瓣)

发表评论

您需要后才能发表评论