Python数据结构与算法—维护有序列表bisect

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

[[402075]]

前言

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

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

有序插入

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

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

 运行之后,效果如下:

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

重复值处理

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

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

 运行之后,效果如下:

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

 

责任编辑:姜华 来源: 今日头条
相关推荐

2020-10-21 14:57:04

数据结构算法图形

2023-03-08 08:03:09

数据结构算法归并排序

2023-10-27 07:04:20

2023-09-25 12:23:18

Python

2023-03-10 08:07:39

数据结构算法计数排序

2023-03-02 08:15:13

2023-03-07 08:02:07

数据结构算法数列

2023-04-27 09:13:20

排序算法数据结构

2023-11-06 06:43:23

单链表查询数据结构

2023-03-13 10:08:31

数据结构算法

2017-08-31 09:45:43

JavaArrayList数据

2023-09-15 10:33:41

算法数据结构

2021-05-12 09:07:09

Java数据结构算法

2023-02-08 07:52:36

跳跃表数据结构

2023-10-30 08:31:42

数据结构算法

2021-06-11 06:10:09

Python数据结构算法

2022-02-22 15:27:46

数据结构容器算法

2021-01-28 07:33:34

JavaScript链表数据

2020-12-31 05:31:01

数据结构算法

2020-10-12 11:48:31

算法与数据结构
点赞
收藏

51CTO技术栈公众号