Python deque的用法介绍
deque 是Python标准库 collections 中的一个类,实现了两端都可以操作的队列,相当于双端队列,与Python的基本数据类型列表很相似。
Python实现双端队列参考:https://blog.csdn.net/weixin_43790276/article/details/104033394
使用Python实现双端队列时,使用了列表,可以用双端队列与 deque 对比,deque类中实现了很多方法,接下来介绍deque类的用法。
一、deque入队和出队
deque 类中实现了单个数据入队,将一个可迭代对象入队,将数据插入指定位置的方法。
1. 单个数据入队
# coding=utf-8
import collections
queue = collections.deque()
queue.append('a')
queue.append('b')
queue.append('c')
print(queue)
queue.appendleft('A')
queue.appendleft('B')
print(queue)
运行结果:
deque(['a', 'b', 'c'])
deque(['B', 'A', 'a', 'b', 'c'])
append(item),添加一个数据到队列的尾部。与列表的append()方法功能相似。
appendleft(item),添加一个数据到队列的头部。与append()的添加方向相反。
2. 可迭代对象入队
queue.extend(['D', 'E'])
queue.extendleft(['c', 'd'])
print(queue)
运行结果:
deque(['d', 'c', 'B', 'A', 'a', 'b', 'c', 'D', 'E'])
extend(iterable),将一个可迭代对象中的数据按顺序添加到队列的尾部。这里要注意,字符串也是可迭代对象,如直接添加字符串'ABC',会将'A'、'B'、'C'添加到队列中,因为'ABC'会被当成一个可迭代对象进行迭代,要将'ABC'作为一个整体的字符串添加可以将其放到列表中,添加['ABC']才会符合预期。
extendleft(iterable),将一个可迭代对象中的数据按顺序添加到队列的头部。
3. 指定位置插入数据
queue.insert(3, 'T')
print(queue)
运行结果:
deque(['d', 'c', 'B', 'T', 'A', 'a', 'b', 'c', 'D', 'E'])
insert(index, item),在队列中的指定位置插入一个数据,index为指定的位置索引。
deque 类中实现了队列两端的出队方法。
print(queue.pop())
print(queue.popleft())
print(queue)
运行结果:
E
d
deque(['c', 'B', 'T', 'A', 'a', 'b', 'c', 'D'])
pop(),将队列尾部的数据弹出,并作为返回值。
popleft(),将队列头部的数据弹出,并作为返回值。
二、deque的copy方法
queue_b = queue.copy()
print(queue)
print(queue_b)
print(id(queue))
print(id(queue_b))
运行结果:
deque(['c', 'B', 'T', 'A', 'a', 'b', 'c', 'D'])
deque(['c', 'B', 'T', 'A', 'a', 'b', 'c', 'D'])
2502045746056
2502045746992
copy(),拷贝队列。拷贝之后,对原队列进行操作,不会影响到拷贝出来的队列。这个方法要在高于Python3.5的版本才有。
三、deque返回指定值的数量和索引
print(queue.count('b'))
queue.append('b')
print(queue.count('b'))
print(queue.count('z'))
print(queue.index('T'))
运行结果:
1
2
0
2
count(item),返回队列中指定值的数量,如果值不存在则返回0。
index(item),返回队列中指定值的索引,如果值不存在则报错,如果有多个相同的数据则返回从左到右第一个值的索引。
四、deque的翻转和轮转
print(queue)
queue.reverse()
print(queue)
queue.rotate(3)
print(queue)
运行结果:
deque(['c', 'B', 'T', 'A', 'a', 'b', 'c', 'D', 'b'])
deque(['b', 'D', 'c', 'b', 'a', 'A', 'T', 'B', 'c'])
deque(['T', 'B', 'c', 'b', 'D', 'c', 'b', 'a', 'A'])
reverse(),将队列翻转。与列表的reverse()方法功能一样。
rotate(num),对队列中的数据进行轮转。每次轮转是将队尾的数据出队然后从队头入队,相当于先pop()再appendleft(item),retate(num)中传入轮转的次数。
五、deque的删除
print(queue)
queue.remove('T')
print(queue)
queue.clear()
print(queue)
运行结果:
deque(['T', 'B', 'c', 'b', 'D', 'c', 'b', 'a', 'A'])
deque(['B', 'c', 'b', 'D', 'c', 'b', 'a', 'A'])
deque([])
remove(item),从队列中删除指定的数据,如果指定的数据不存在则报错,如果有多个相同的数据则只会删除从左到右的第一个数据。
clear(),将队列清空。
六、deque指定队列的长度
que = collections.deque(maxlen=5)
que.extend(['a', 'b', 'c', 'd', 'e'])
print(que)
que.append('F')
print(que)
que.appendleft('A')
print(que)
运行结果:
deque(['a', 'b', 'c', 'd', 'e'], maxlen=5)
deque(['b', 'c', 'd', 'e', 'F'], maxlen=5)
deque(['A', 'b', 'c', 'd', 'e'], maxlen=5)
在实例化队列时,可以使用maxlen方法指定队列的长度。为了方便使用,deque类中用property将maxlen方法转换成了属性,并且deque类初始化时可将maxlen作为参数传入。
指定队列的长度后,如果队列已经达到最大长度,此时从队尾添加数据,则队头的数据会自动出队。队头的数据相等于被队尾新加的数据“挤”出了队列,以保证队列的长度不超过指定的最大长度。反之,从队头添加数据,则队尾的数据会自动出队。
最近在pythonTip做题的时候,遇到了deque模块,以前对其不太了解,现在特此总结一下
deque模块是python标准库collections中的一项,它提供了两端都可以操作的序列,这意味着,在序列的前后你都可以执行添加或删除操作。
1.创建deque序列:
from collections import deque
d=deque()
2.deque提供了类似list的操作方法:
d=deque()
d.append(3)
d.append(8)
d.append(1)
那么此时d=deque([3,8,1]),len(d)=3,d[0]=3,d[-1]=1
3.两端都使用pop:
d=deque(‘12345’)
那么d=deque(['1', '2', '3', '4', '5'])
d.pop()抛出的是’5’,d.leftpop()抛出的是’1’,可见默认pop()抛出的是最后一个元素。
4.限制deque的长度
d=deque(maxlen=20)
for i in range(30):
d.append(str(i))
此时d的值为d=deque(['10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29'], maxlen=20),可见当限制长度的deque增加超过限制数的项时,另一边的项会自动删除。
5.添加list各项到deque中:
d=deque([1,2,3,4,5])
d.extend([0])
那么此时d=deque([1,2,3,4,5,0])
d.extendleft([6,7,8])
此时d=deque([8, 7, 6, 1, 2, 3, 4, 5, 0])
通过以上的一些操作,我们大致可以了解deque()的性质了。