热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[转载]Python的双端队列deque

参考链接:Python中的双端队列DeQuePython的强大并不在于它的语法,而在于它的库,当你对各种数据结构感到苦恼时,

参考链接: Python中的双端队列DeQue

Python的强大并不在于它的语法,而在于它的库,当你对各种数据结构感到苦恼时,Python提供了各种开箱即用的数据结构。 

数据结构中最常讲授的数据结构有栈、队列、双端队列。 

栈是一种特殊的线性表,它只允许在一端进行插入、删除操作,这一端被称为栈顶(top),另一端则被称为栈底(bottom)。 

从栈顶插入一个元素被称为进栈,将一个元素插入栈顶被称为“压入栈”,对应的英文说法为push。 

从栈顶删除一个元素被称为出栈,将一个元素从栈顶删除被称为“弹出栈”,对应的英文说法为pop。对于栈而言,最先入栈的元素位于栈底,只有等到上面所有元素出栈之后,栈底的元素才能出栈。因此栈是一种后进先出(LIFO)的线性表。 

图1为栈的操作示意图。  队列也是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。 

对于一个队列来说,每个元素总是从队列的rear端进入队列,然后等待该元素之前的所有元素出队之后,当前元素才能出队。因此,把队列简称为先进先出(FIFO)的线性表。 

队列的示意如图2所示。  双端队列(即此处介绍的deque)代表一种特殊的队列,它可以在两端同时进行插入、删除操作,如图3所示。  对于双端队列,由于它可以从两端分别进入插入、删除操作,如果程序将所有的插入、删除操作固定在一端进行,这个双端队列就变成前面介绍的栈;如果固定在一端只添加元素、在另一端只删除元素,那它就是队列,因此,deque既可当成队列使用,也可当成栈使用。 

deque位于collections包下,在交互式解释器中先导入collections包,然后输入[e for e in dir(collections.deque) if not e.startswith(’_’)]来查看deque的全部方法,可看到如下输出。 

>>> from collections import deque

>>> [e for e in dir(deque) if not e.startswith('_')]

['append', 'appendleft', 'clear', 'copy', 'count', 'extend', 'extendleft', 'index', 'insert', 'maxlen', 'pop', 'popleft', 'remove', 'reverse', 'rotate']

 

从上面方法可以看出,deque的方法基本都有两个版本,这就体现了它作为双端队列的特征。deque的左边(left)就相当于它的队列头(front)、右边(right)就相当于它的队列尾(rear)。 

 append和appendleft:在deque的右边或左边添加元素;也就是默认在队列尾添加元素。  pop和popleft:在deque的右边或左边弹出元素;也就是默认在队列尾弹出元素。  extend和extendleft:在deque的右边或左边添加多元素;也就是默认在队列尾添加多个元素。  

deque中clear()方法用法清空队列,insert()方法则是线性表的方法,用于在指定位置插入元素。 

假如程序要把deque当成栈使用,意味着只在一端添加、删除元素,因此调用append和pop方法即可。例如如下代码。 

'''

遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

'''

from collections import deque

stack = deque(('Kotlin', 'Python'))

# 元素入栈

stack.append('Erlang')

stack.append('Swift')

print('stack中的元素:' , stack)

# 元素出栈,后添加的元素先出栈

print(stack.pop())

print(stack.pop())

print(stack)

 

运行上面程序,可看到如下结果。 

stack中的元素:deque(['Kotlin', 'Python', 'Erlang', 'Swift'])

Swift

Erlang

deque(['Kotlin', 'Python'])

 

从上面运行结果可以看出:程序最后入栈的元素’Swift’最先出栈,这体现了栈的LIFO的特征。 

假如程序需要把deque当成队列使用,意味着一端只是用来添加元素,另一端只是用于删除元素,因此调用append、popleft方法组合即可。例如如下代码。 

'''

遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

'''

from collections import deque

 

q = deque(('Kotlin', 'Python'))

# 元素加入队列

q.append('Erlang')

q.append('Swift')

print('q中的元素:' , q)

# 元素出队列,先添加的元素先出队列

print(q.popleft())

print(q.popleft())

print(q)

 

运行上面程序,可看到如下结果。 

q中的元素:deque(['Kotlin', 'Python', 'Erlang', 'Swift'])

Kotlin

Python

deque(['Erlang', 'Swift'])

 

从上面运行结果可以看出:程序先添加的元素’Kotlin’最先出队列,这体现了栈的FIFO的特征。 

此外,deque还有一个rotate()方法,该方法的作用是将队列的队尾元素移动到队头来,使之首尾相连。例如如下程序。 

'''

遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

'''

from collections import deque

 

q = deque(range(5))

print('q中的元素:' , q)

# 执行旋转,使之首尾相连

q.rotate()

print('q中的元素:' , q)

# 再次执行旋转,使之首尾相连

q.rotate()

print('q中的元素:' , q)

-------------------------------------------

运行上面程序,可以看到如下输出。

q中的元素:deque([0, 1, 2, 3, 4])

q中的元素:deque([4, 0, 1, 2, 3])

q中的元素:deque([3, 4, 0, 1, 2])

 

从上面程序运行结果来看,每次执行rotate()方法,deque的队尾元素都会被移到队头,这样就形成了首尾相连的效果。


推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
author-avatar
大永8899_226
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有