collections模块之deque双向队列

451 阅读3分钟

deque,是双向队列,是一种高性能的数据结构之一.它的操作类似于列表list,但比list拥有更低的时间复杂度和空间复杂度。

from collections import deque
​
deque1 = deque([1, 2, 3, 4])
print(deque1)

result:

deque([1, 2, 3, 4])

为了便于叙述,先生成一个双向队列以供使用。下面的代码将直接引用操作该队列,不再重新定义生成。

现在介绍常用方法如下:

1 append方法

该方法和list的append方法一样,都是从末尾(队尾)添加元素

deque1.append(5)
print(deque1)

result:

deque([1, 2, 3, 4, 5])

2 appendleft方法

该方法是从队首插入元素,虽然list的insert(0, obj)也能实现该效果,但性能不如该方法

deque1.appendleft(6)
print(deque1)

result:

deque([6, 1, 2, 3, 4])

3 clear方法

该方法和list的clear方法一样,都是清空里面的所有元素。

deque1.clear()
print(deque1)

result:

deque([])

4 count方法

该方法和list的count方法一样,返回队列中包含value的个数

print(deque1.count(4))

result:

1

5 extend方法

该方法和list的extend方法一样,用于扩展序列

5.1 扩展的内容为字典时

extend添加的对象为字典时,会将字典的key加入到队列,value则被丢弃

deque1.extend({1: 2})
print(deque1)

result:

deque([1, 2, 3, 4, 1])

5.2 其他

deque1.extend([5])
print(deque1)

result:

deque([1, 2, 3, 4, 5])

6 extendleft方法

作用和extend一样,只不过该方法是在队首开始扩展,而extend是在队尾进行扩展

deque1.extendleft([5])
print(deque1)

result:

deque([5, 1, 2, 3, 4])

7 pop方法

该方法和list的pop方法一样,用于删除末尾的元素

deque1.pop()
print(deque1)

result:

deque([1, 2, 3])

8 popleft方法

作用和pop一样,只不过该方法是从队首删除元素,而pop是从队尾删除元素。和list的pop(0)效果一致。

deque1.extendleft([5])
print(deque1)

result:

deque([2, 3, 4])

9 remove方法

该方法和list的remove方法一样,用于删除第一次出现的元素。当然,被删除的元素不存在则会报错

deque2 = deque([1, 2, 3, 4, 1, 5])
deque2.remove(1)
print(deque2)

result:

deque([2, 3, 4, 1, 5])

10 reverse方法

该方法和list的reverse方法一样,用于元素反转

deque1.reverse()
print(deque1)

result:

deque([4, 3, 2, 1])

11 rotate方法

对队列内的元素进行移动

11.1 移动长度为正数

此时相当于元素从左向右移动

deque1.rotate(1)
print(deque1)

result:

deque([4, 1, 2, 3])

这里是将队列向右移动一个单位,最后一个元素移到了最前面,其余的元素按顺序依次右移

deque1.rotate(3)
print(deque1)

result:

deque([2, 3, 4, 1])

这里是将队列向右移动三个单位,相当于把,相当于把deque1.rotate(1)的动作重复了三遍

11.2 移动长度为负数

此时相当于元素从右向左移动

deque1.rotate(-1)
print(deque1)

result:

deque([2, 3, 4, 1])

这里是将队列向左移动以个单位,第一个元素移到了末尾,第二个元素移到了开头,第三个元素移到了第二的位置上,第四的元素移到了第三的位置上。

deque1.rotate(-3)
print(deque1)

result:

deque([4, 1, 2, 3])

这里是将队列向左移动三个单位,相当于把deque1.rotate(-1)的动作重复了三遍