版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013486414/article/details/85335799
写在之前
双端队列(deque)同时具备栈和队列的特征,栈是先进后出的数据结构,队列是先进先出的数据结构(请先知道这个概念),所以双端队列可以从序列的任何一端添加和删除项。
双端队列(deque)
首先我们先来看一个简单的小问题:如果有一个列表,比如 [1,2,3],让你在最右边增加一个数字。看到这你肯定要说,这也太简单了,不就是 append() 一下嘛。
这个是简单,但能不能在最左边增加一个数字呢?请先思考一下,思考完毕后请接着往下看:
>>> l1 = [1,2,3]
>>> l1.append(4)
>>> l1
[1, 2, 3, 4]
>>> n = [7]
>>> n.extend(l1)
>>> n
[7, 1, 2, 3, 4]
除了上述方法以外,或许你还有别的办法。但是,追求简洁优雅的 Python 早就替我们想好了,它为我们提供了一个更简单的模块来解决这个问题。
>>> from collections import deque
用上述的这种引用方法是以为 collections 中东西很多,我们这次只用到 deque。
>>> l1 = [1,2,3,4]
这次还是用这个列表,试试分别从右边和左边增加数字。
>>> ql = deque(l1)
上面这个是必须的,将列表转换成 deque 对象。deque 就是翻译过来的双端队列(Double-ended Queue)。
>>> ql.append(5)
>>> ql
deque([1, 2, 3, 4, 5])
>>> ql.appendleft(7)
>>> ql
deque([7, 1, 2, 3, 4, 5])
这样的操作可以说是相当方便了。然后下面让我们继续来看如何删除:
>>> ql.pop()
5
>>> ql
deque([7, 1, 2, 3, 4])
>>> ql.popleft()
7
>>> ql
deque([1, 2, 3, 4])
函数 popleft() 是去掉最左边的项并返回该项,pop() 是去掉最右边的项并返回该项。接下来我们来做一个小题,加深一下印象:判断一下一个词是不是回文。判断回文的话我们都知道,最简单的就是从一个词的两端向中间扫描,只要两端的字符匹配,一直弹出直到到达中间:
from collections import deque
def palindrome(word):
dq = deque(word)
while len(dq) > 1:
if dq.popleft() != dq.pop():
return False
return True
代码基本上就是像上面写的那样,接下来让我们来测试一下:
print(palindrome('a'))
print(palindrome('rocky'))
print(palindrome(''))
print(palindrome('radar'))
运行的结果如下所示:
True
False
True
True
写在之后
更多内容,欢迎关注公众号「Python空间」,期待和你的交流。