1. 前言
在Python中列表list
是一个常用的容器,类似于其他编程语言中的数组,列表中有很多常见的方法
• append()
在列表最后的位置添加元素
• pop()
用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
• extend()
用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
• …
2. deque简介
介绍
接下来介绍Python中的另一个类似于列表的容器: deque
from collection import deque
deque
提供了⼀个双端队列,你可以从头/尾两端添加或删除元素,下面以一张图简示双端队列的功能
优点
相比于list
实现的队列,deque
实现拥有更低的时间和空间复杂度。
list
实现在出队pop()
和插入insert()
时的时间复杂度大约为O(n),deque
在出队pop()
和入队append()
时的时间复杂度是O(1)。所以deque
更有优越性 而且deque
既可以表示队列 又可以表示栈
3. deque方法
下面介绍下 deque
常用的一些方法
from collections import deque
# 首先创建一个队列对象
d = deque()
print(type(d))
Out: <class 'collections.deque'>
向队列中添加数据
• append()
,从结果看起来,这个队列的数据结构和列表的用法十分相似
d.append('hello')
d.append('world')
d.append('!')
print(d, len(d), d[0], d[-1])
Out: deque(['hello', 'world', '!']) 3 hello !
• appendleft()
,从队列的左边插入数据
d.appendleft('my name is nancy,')
print(d)
Out: deque(['my name is nancy,', 'hello', 'world', '!'])
• extend()
,添加可迭代的数据结构
d.extend([1, 2, 3])
print(d)
Out: deque(['my name is nancy,', 'hello', 'world', '!', 1, 2, 3])
• extendleft()
从队列的左边插入可迭代的数据结构,这里需要注意一下,extendleft()
中给的插入的数据,会从左至右依次遍历然后插入到队列的左端,所以该数据结构中的最左边的元素会被第一个插入,所以看起来插入的数据顺序会倒过来
d.extendleft([3, 2, 1])
print(d)
Out: deque([1, 2, 3, 'my name is nancy,', 'hello', 'world', '!', 1, 2, 3])
删除数据
• pop()
和 popleft()
d.pop()
d.popleft()
Out: deque([2, 3, 'my name is nancy,', 'hello', 'world', '!', 1, 2])
限制长度
我们在创建 deque()
对象的时候可以添加 maxlen
参数来限制这个列表的长度(大小)
当容器中的元素超过指定的长度时,数据会从对队列另⼀端被挤出去。
from collections import deque
d = deque(maxlen=10)
d.extend([1, 2, 3, 4, 5, 6, 7, 8, 9])
print(d)
Out: deque([1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
d.extend([10, 11, 12])
print(d, len(d))
Out: deque([3, 4, 5, 6, 7, 8, 9, 10, 11, 12], maxlen=10) 10
d.extendleft([13, 14])
print(d)
Out: deque([14, 13, 3, 4, 5, 6, 7, 8, 9, 10], maxlen=10)
其他方法
其他的一些基本操作 还有
• d.insert(位置,元素)
在指定位置插入元素
• d.remove(元素)
删除指定元素
• d.reverse()
队列翻转
• d.rotate(1)
顺时针旋转
• d.rotate(-1)
逆时针旋转
• …