双端队列
在需要按添加元素的顺序进行删除时,双端队列很有用。在模块collections中,包含类型deque以及其他几个集合(collection)类型。
与集合(set)一样,双端队列也是从可迭代对象创建的,它包含多个很有用的方法。
- A=deque([]) #创建一个空的双队列
- A.append(n) #从右边像队列中增加元素 ,n表示增加的元素
- A.appendleft(n) #从左边像队列中增加元素,n表示增加的元素
- A.clear() #清空队列
- A.count(n) #在队列中统计元素的个数,n表示统计的元素
- A.extend(n) #从右边扩展队列,n表示扩展的队列
- A.extendleft(n) #从左边扩展队列,n表示扩展的队列
- A.pop() #从队列的右边删除元素,并且返回删除值
- A.popleft() #从队列的左边删除元素,并且返回删除值
- A.remove(n) #从队列中删除指定的值‘
- A.reverse() #翻转队列
- A.rotate(n) #旋转队列,默认时值为1,由右边开始旋转,负值代表左边旋转,n代表从队列的第一个元素开始,n从1开始计数
例:
>>> from collections import deque
>>> q = deque(range(5)) #设置deque队列容器只能容纳5个元素
>>> q.append(5)
>>> q.appendleft(6)
>>> q
deque([6, 0, 1, 2, 3, 4, 5])
>>> q.pop()
5
>>> q.popleft()
6
>>> q.rotate(3) #设置最后3个元素2、3、4向左移,环绕到开始一端,如果参数为负数,则向右移放到最后。
>>> q
deque([2, 3, 4, 0, 1])
>>> q.rotate(-1)
>>> q
deque([3, 4, 0, 1, 2])
双端队列很有用,因为它支持在队首(左端)高效地附加和弹出元素,而使用列表无法这样做。另外,还可高效地旋转元素(将元素向右或向左移,并在到达一端时环绕到另一端)。双端队列对象还包含方法extend和extendleft,其中extend类似于相应的列表方法,而extendleft类似于appendleft。请注意,用于extendleft的可迭代对象中的元素将按相反的顺序出现在双端队列中。
>>> d = collections.deque()
>>> d.extendleft(range(6))
>>> d deque([5, 4, 3, 2, 1, 0])
统计队列中元素个数
使用count()方法统计队列中某个元素的个数。
from collections import deque
d = deque("abac")
d.count('a') #输出2
反转队列
使用reverse方法反转队列:
from collections import deque
d = deque(range(10))
d.reverse()
maxlen(队列最大长度)
deque还可以设置队列的长度,使用 deque(maxlen=N) 构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候, 最老的元素会自动被移除掉。
如果你不设置最大队列大小,那么就会得到一个无限大小队列。
from collections import deque
d1 = deque(maxlen=5)
d2 = deque(range(10),4)
Deque的缺点就是remove还有判断获取索引的时候,速度有些慢, 因为他需要执行多遍deque相关联的数据块 。不像list那样,搞一遍就行。