python 双端队列:collections.deque 基本方法总结

1. 概述

之前一篇博客介绍了一下 python 中队列的基本操作:Python 队列模块 Queue 的常用操作。但是我们发现了两个问题:

  1. 向一个空的队列进行 get() 操作会进入“死循环”
  2. get 操作和我们理解的 get 操作有点差异,我们有时只需要知道队头元素时什么,但是不想取出。可以在 Queue 模块中,我们只能先 get,然后重新放入,并且还要重新调整好顺序。

今天的双端队列一方面可以解决上述问题,另一方面某些场景下栈和队列都不能很好的对数据建模,而双端队列可以。双端队列可以看成栈和队列的结合,可以使用栈和队列的场景也可以使用双端队列,但是反之不成立。

普通队列只能在队尾添加,队头弹出。而双端队列在队尾和队头都可以添加和弹出。队尾的添加和弹出可以看成栈,队尾的添加和队头的弹出可以看成队列。

2. 基本方法

引入模块并新建一个双端队列:

import collections


d = collections.deque()

2.1 len(d) :返回队列中元素的数量。

import collections


d = collections.deque()
d.append(1)
d.append(2)
d.append(3)
d.append(4)
d.append(50)
print(d)
print(len(d))

在这里插入图片描述

2.2 d.appendleft(x) :将元素 x 加到队头。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(3)
d.appendleft(4)
d.append(50)
print(d)
print(len(d))

在这里插入图片描述

2.3 d.append(x) :将元素 x 加到队尾。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(3)
d.appendleft(4)
d.append(50)
print(d)
print(len(d))

在这里插入图片描述

2.4 d.popleft() :将队头元素弹出,并作为返回值,如果双端队列为空会报错。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(3)
d.appendleft(4)
d.append(50)
print(d)
print(len(d))
print(d.popleft())
print(d)
print(len(d))
print(d.pop())
print(d)

在这里插入图片描述

2.5 d.pop() :将队尾元素弹出,并作为返回值,如果双端队列为空会报错。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(3)
d.appendleft(4)
d.append(50)
print(d)
print(len(d))
print(d.popleft())
print(d)
print(len(d))
print(d.pop())
print(d)

在这里插入图片描述

2.6 d[0] :访问并返回队头元素,但不弹出,如果双端队列为空会报错。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(3)
d.appendleft(4)
d.append(50)
print(d)
print(d[0])
print(d[-1])
print(d)

在这里插入图片描述

2.7 d[-1] :访问并返回队尾元素,但不弹出,如果双端队列为空会报错。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(3)
d.appendleft(4)
d.append(50)
print(d)
print(d[0])
print(d[-1])
print(d)

在这里插入图片描述

2.8 d[j] :通过索引访问任意一项,如果索引(队列内部以 0 索引开头)超过范围会报错。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(3)
d.appendleft(4)
d.append(50)
print(d)
print(d[2])
d[2] = 100
print(d[2])
print(d)

在这里插入图片描述

2.9 d[j] = val :通过索引修改任意一项,如果索引(队列内部以 0 索引开头)超过范围会报错。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(3)
d.appendleft(4)
d.append(50)
print(d)
print(d[2])
d[2] = 100
print(d[2])
print(d)

在这里插入图片描述

2.10 d.clear() :清空双端队列。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(3)
d.appendleft(4)
d.append(50)
print(d)
d.clear()
print(d)

在这里插入图片描述

2.11 d.rotate(k) :循环右移 k 步。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(3)
d.appendleft(4)
d.append(50)
print(d)
d.rotate(2)
print(d)

在这里插入图片描述

2.12 d.remove(e) :移除第一个匹配的元素,如果队列中没有匹配元素会报错。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(50)
d.append(3)
d.appendleft(4)
d.append(50)
d.append(50)
d.append(50)
print(d)
d.remove(50)
print(d)

在这里插入图片描述

2.13 d.count(e) :统计对于 e 匹配的数量,如果队列中没有此元素,计数为 0。

import collections


d = collections.deque()
d.append(1)
d.appendleft(2)
d.append(50)
d.append(3)
d.appendleft(4)
d.append(50)
d.append(50)
d.append(50)
print(d)
print(d.count(50))
d.remove(50)
print(d)
print(d.count(50))

在这里插入图片描述

2.14 d.extend(list):队尾扩展多个元素

import collections


d = collections.deque()
d.append(1)
d.append(2)
print(d)
d.extend([3, 4, 5])
print(d)

在这里插入图片描述

2.15 d.extendleft(list):队头扩展多个元素,是把 list 中的元素按顺序放在队头,因此 list 中左边的元素在双端队列中会在右边。

import collections


d = collections.deque()
d.append(1)
d.append(2)
print(d)
d.extendleft([3, 4, 5])
print(d)

在这里插入图片描述

2.16 d.index(e) :返回第一个匹配元素的位置索引,如果队列中没有匹配元素会报错。

import collections


d = collections.deque()
d.append(1)
d.append(1)
d.append(2)
print(d)
d.extendleft([3, 4, 5])
print(d)
print(d.index(1))

在这里插入图片描述

2.17 d.insert(index,a) :将 a 放入index 索引。index 支持负索引,超出右边索引会添加到最右边,超过左边索引会添加到最左边。

import collections


d = collections.deque()
d.append(1)
d.append(1)
d.append(2)
d.extendleft([3, 4, 5])
print(d)
d.insert(1, 100)
print(d)
d.insert(47, 200)
d.insert(-100, 300)
print(d)

在这里插入图片描述

2. 18 d.reverse():反转双端队列

import collections


d = collections.deque()
d.append(1)
d.append(1)
d.append(2)
d.extendleft([3, 4, 5])
print(d)
d.insert(1, 100)
print(d)
d.insert(47, 200)
d.insert(-100, 300)
print(d)
d.reverse()
print(d)

在这里插入图片描述

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值