简单介绍python的双向队列

简单介绍python的双向队列

介绍

  大家都知道利用 .append 和 .pop 方法,我们可以把列表当作栈或者队列来用(比如,把 append 和 pop(0) 合起来用,就能模拟栈的“先进先出”的特点)。但是删除列表的第一个元素(抑或是在第一个元素之前添加一个 元素)之类的操作是很耗时的,因为这些操作会牵扯到移动列表里的所有元素。这个时候双向队列就又作用了。

deque 是什么

  collections.deque 类(双向队列)是一个线程安全、可以快速从两端添加或者删除元素的数据类型。而且如果想要有一种数据类型来存 放“最近用到的几个元素”,deque 也是一个很好的选择。这是因为在新建一个双向队列的时候,你可以指定这个队列的大小,如果这个队列满员了,还可以从反向端删除过期的元素,然后在尾端添加新的元素。

下面用几个实例来说明如何使用双向队列以及带来了什么方便的处理方式。

一开始我们需要先初始化一个固定长度的双向队列便于我们实验。

说明:maxlen 是一个可选参数,代表这个队列可以容纳的元素的数量,不可变。

from collections import  deque
#双向队列
listdq=deque(range(10),maxlen=10)
print (listdq)

1.正向旋转(循环)

 说明:队列的旋转操作接受一个参数 n,当 n > 0 时,队列的最右边的 n 个元素会被移动到队列的左边。当 n < 0 时,最左边的 n 个元素会被 移动到右边。

#正向旋转
listdq.rotate(2)
print(listdq)

2.反向旋转(逆时针)

#反向旋转
listdq.rotate(-2)
print(listdq)

3.附加数据

说明:当试图对一个已满(len(d) == d.maxlen)的队列做尾部添加操作的时候,它头部的元素会被删除掉。注意在下一行里,元素 0 被删除 了。


#附加数据
listdq.appendleft(-1)
print(listdq)
listdq.append(10)
print(listdq)
 

4.扩展数据

说明:extendleft(iter) 方法会把迭代器里的元素逐个添加到双向队列的左边,因此迭代器里的元素会逆序出现在队列里。注意是逆序。

#扩展数据
listdq.extendleft([20,30,40])
print(listdq)
listdq.extend([50])
print(listdq)

以上代码结果如下:

<span>简单介绍python的双向队列</span>

双向列表和队列的方法介绍:

<span>简单介绍python的双向队列</span>

 

总结:

本篇总结了列表和双向队列这两个类型的方法(object 类包含的方 法除外)。
双向队列实现了大部分列表所拥有的方法,也有一些额外的符合自身设 计的方法,比如说 popleft 和 rotate。但是为了实现这些方法,双向 队列也付出了一些代价,从队列中间删除元素的操作会慢一些,因为它 只对在头尾的操作进行了优化。
append 和 popleft 都是原子操作,也就说是 deque 可以在多线程程序 中安全地当作先进先出的栈使用,而使用者不需要担心资源锁的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119657.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 多重排序 js「建议收藏」

    多重排序 js「建议收藏」如何做到多重排序js有一个sort排序函数,使用array.sort(function)传入排序函数就可以很做到排序array.sort((a,b)=>{returna-b;})注意一点就是返回结果决定了a和b的位置,如果返回结果<0,那么a排在b的前面返回结果=0a和b的相对位置不变返回结果>0b排在a的前面现在让你对学生成绩单进行排序,先按照学号,从小到大…

    2025年6月15日
    0
  • myeclipse 的 svn插件安装 —– myeclipse2017,2018

    myeclipse 的 svn插件安装 —– myeclipse2017,20181.下载site-1.10.13-1.9.x  官方版:http://subclipse.tigris.org/files/documents/906/49486/site-1.10.13-1.9.x.zip(点击直接下载)2.打开压缩包会发现目录结构如下:3.将features文件夹中的文件复制到Myeclipse安装目录中的features文件夹中,…

    2022年7月20日
    9
  • ARIMA_如何确定arima模型的阶数

    ARIMA_如何确定arima模型的阶数1 总体介绍在以下主题中,我们将回顾有助于分析时间序列数据的技术,即遵循非随机顺序的测量序列。与在大多数其他统计数据的上下文中讨论的随机观测样本的分析不同,时间序列的分析基于数据文件中的连

    2022年8月5日
    3
  • idea2021.3 永久激活码破解方法

    idea2021.3 永久激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    50
  • ubuntu中文输入法_ubuntu如何设置中文输入法

    ubuntu中文输入法_ubuntu如何设置中文输入法在Ubtuntu12.10中自带了中文输入法,可通过Ctrl+Space进行输入法到切换,在英文系统中同样已经预装了ibus,只需要下载一下简体中文语言包即可。如何安装简体中文语言包?依次选择SytemSetting–>LanguageSupport–>Install/RemoveLanguages后,将出现如下图所示窗口:将右侧Installed栏的选择框勾…

    2022年9月26日
    0
  • 为什么要做深度学习而不是宽度学习?「建议收藏」

    为什么要做深度学习而不是宽度学习?「建议收藏」点击此处返回总目录 前面在深度学习介绍的最后有留下一个疑问。我们为什么要dee…

    2022年5月21日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号