python中deque模块详解

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),返回队列中指定值的数量,如果值不存在则返回0index(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()的性质了。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
deque(双端队列)是Python标准库collections模块的一种数据结构,它可以在队列的两端进行添加和删除操作,因此可以用于实现栈和队列。 deque支持的操作包括: 1. append(x):在deque的右端添加元素x。 2. appendleft(x):在deque的左端添加元素x。 3. clear():清空deque。 4. count(x):返回deque元素x的个数。 5. extend(iterable):在deque的右端添加可迭代对象iterable的所有元素。 6. extendleft(iterable):在deque的左端添加可迭代对象iterable的所有元素,注意添加顺序与iterable的顺序相反。 7. pop():删除并返回deque右端的元素。 8. popleft():删除并返回deque左端的元素。 9. remove(x):删除deque第一个值为x的元素,如果没有找到则抛出ValueError异常。 10. reverse():将deque的元素反转。 11. rotate(n=1):将deque的元素向右移动n步,如果n为负数则向左移动。移动的元素会从deque的一端移动到另一端,因此deque的长度不变。 使用deque需要先导入collections模块: ``` from collections import deque ``` 然后可以通过以下方式创建一个deque对象: ``` d = deque() ``` 也可以通过传入一个可迭代对象来初始化deque: ``` d = deque([1, 2, 3]) ``` 使用deque的操作与列表类似,例如: ``` d.append(4) d.appendleft(0) d.extend([5, 6]) d.extendleft([-1, -2]) d.pop() d.popleft() d.remove(3) d.reverse() d.rotate(2) ``` 注意,由于deque支持在两端进行添加和删除操作,因此它的时间复杂度比列表更优秀,特别是在涉及到大量添加和删除操作的场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值