专栏首页Python空间Python 标准库之双端队列

Python 标准库之双端队列

本文字数:1498 字 阅读本文大概需要:4 分钟

写在之前

在昨天的文章(Python 标准库之 OS)中我们学习了Python 标准库中非常强大的 os,今天我们来见识一下 Python 标准库的双端队列。

双端队列(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 基础基本快要结束了,期间收到很多读者在后台的留言,说能不能找一些题目来做,看完了不用过会儿就忘记了。其实我本来早就有这个打算,但总是忘记了,出题什么的真的是件很麻烦的事,既然很多人说的话,我可能准备在这个系列全部结束以后,拿出一段时间来每天发几道题给大家切一切,这个还是个想法,具体后面再说。

如果你还有什么想法,或者是还有哪些东西你觉得学不会,都可以在后台或者我的微信里告诉我,说不定哪天就写写你不会的地方。最后就是老话,觉得对你有帮助,点个赞再走。

The end。

本文分享自微信公众号 - Python空间(Devtogether),作者:Rocky0429

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 奇怪的 Python 整数缓存机制。

    当 a 和 b 的值皆为 1024 的时候,a is b 为 False,那这里我有一个问题:当 a 和 b 的值皆为 6 的时候,a is b 的输出结果是什...

    Rocky0429
  • 零基础学习 Python 之文件(二)

    大家好,这里是零基础学习 Python 系列,在这里我将从最基本的Python 写起,然后再慢慢涉及到高阶以及具体应用方面。我是完全自学的 Python,所以很...

    Rocky0429
  • 零基础学习 Python 之封装

    今天来讲 OOP 的最后一个特性:「封装」。封装是对具体对象的一种抽象,简单来说就是将某些部分隐藏起来,在程序外部看不到,这个看不到不是说人用眼睛看不到那个代码...

    Rocky0429
  • C++雾中风景10:聊聊左值,纯右值与将亡值

    左值(lvalue)和右值(rvalue)是C++类型系统之中的基础概念,我们不需要了解这些基础概念,同样也能写出代码。但是如果没有弄清左右值的概念,对于许多C...

    HappenLee
  • shell+curl监控网站页面(域名访问状态),并利用sedemail发送邮件

    应领导要求,对公司几个主要站点的域名访问情况进行监控。下面分享一个监控脚本,并利用sendemail进行邮件发送。 监控脚本如下: 下面是写了一个多线程的网站状...

    洗尽了浮华
  • Egg.js 笔记一 快速入门

    tonglei0429
  • Confluence 6 配置时间和日期格式 原

    你可以修改你 Confluence 为用户显示的时期和时间格式。设置的句法使用的是 SimpleDateFormat class,请参考 Java Simple...

    HoneyMoose
  • C++核心准则Enum.6:避免无名枚举

    If you can't name an enumeration, the values are not related

    面向对象思考
  • [Java] 设计模式: Code Shape - 管理你的代码结构

    绿巨人
  • [Java] Design Pattern:Code Shape - manage your code shape

    绿巨人

扫码关注云+社区

领取腾讯云代金券