详解Python的collections模块中的deque双端队列结构


Posted in Python onJuly 07, 2016

deque 是 double-ended queue的缩写,类似于 list,不过提供了在两端插入和删除的操作。

  • appendleft 在列表左侧插入
  • popleft 弹出列表左侧的值
  • extendleft 在左侧扩展

例如:

queue = deque()
# append values to wait for processing
queue.appendleft("first")
queue.appendleft("second")
queue.appendleft("third")
# pop values when ready
process(queue.pop()) # would process "first"
# add values while processing
queue.appendleft("fourth")
# what does the queue look like now?
queue # deque(['fourth', 'third', 'second'])

作为一个双端队列,deque还提供了一些其他的好用方法,比如 rotate 等,下面我们一起来看一下:

填充
deque可以从任意一端填充,在python实现称为“左端”和“右端”。

import collections
d1 = collections.deque()
d1.extend('abcdefg')
print 'extend:', d1
d1.append('h')
print 'append:', d1
d2 = collections.deque()
d2.extendleft(xrange(6))
print 'extendleft', d2
d2.appendleft(6)
print 'appendleft', d2

extendleft()迭代处理其输入,对每个元素完成与appendleft()相同的处理。

extend: deque(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
append: deque(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
extendleft deque([5, 4, 3, 2, 1, 0])
appendleft deque([6, 5, 4, 3, 2, 1, 0])

利用
可以从两端利用deque元素,取决于应用的算法。

import collections
print "From the right:"
d = collections.deque('abcdefg')
while True:
 try:
  print d.pop(),
 except IndexError:
  break
print
print "\nFrom the left:"
d = collections.deque(xrange(6))
while True:
 try:
  print d.popleft(),
 except IndexError:
  break
print

使用pop()可以从deque右端删除一个元素,使用popleft()可以从deque左端删除一个元素。

From the right:
g f e d c b a

From the left:
0 1 2 3 4 5

由于双端队列是线程安全的,可以在不同的线程中同时从两端利用队列的内容。

import collections
import threading
import time
candle = collections.deque(xrange(5))
def burn(direction, nextSource):
 while True:
  try:
   next = nextSource()
  except IndexError:
   break
  else:
   print '%8s: %s' % (direction, next)
   time.sleep(0.1)
 print '%8s done' % direction
 return
left = threading.Thread(target=burn, args=('Left', candle.popleft))
right = threading.Thread(target=burn, args=('Right', candle.pop))
left.start()
right.start()
left.join()
right.join()

线程交替处理两端,删除元素,知道这个deque为空。

Left: 0 Right: 4

 Right: 3 Left: 1

 Right: 2 Left done

 Right done

旋转
deque另外一个作用可以按照任意一个方向旋转,而跳过一些元素。

import collections
d = collections.deque(xrange(10))
print 'Normal:', d
d= collections.deque(xrange(10))
d.rotate(2)
print 'Right roration:', d
d = collections.deque(xrange(10))
d.rotate(-2)
print 'Left roration:', d

结果:

Normal: deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Right roration: deque([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
Left roration: deque([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])

再举个例子:

# -*- coding: utf-8 -*-
"""
下面这个是一个有趣的例子,主要使用了deque的rotate方法来实现了一个无限循环
的加载动画
"""
import sys
import time
from collections import deque
fancy_loading = deque('>--------------------')
while True:
 print '\r%s' % ''.join(fancy_loading),
 fancy_loading.rotate(1)
 sys.stdout.flush()
 time.sleep(0.08)

输出结果:

# 一个无尽循环的跑马灯 
------------->-------
Python 相关文章推荐
Python日期操作学习笔记
Oct 07 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
Python干货:分享Python绘制六种可视化图表
Aug 27 Python
python读取几个G的csv文件方法
Jan 07 Python
python可视化实现KNN算法
Oct 16 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 Python
django 装饰器 检测登录状态操作
Jul 02 Python
python 下划线的不同用法
Oct 24 Python
python实现模拟器爬取抖音评论数据的示例代码
Jan 06 Python
Pandas 稀疏数据结构的实现
Jul 25 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 Python
简单掌握Python的Collections模块中counter结构的用法
Jul 07 #Python
Python处理json字符串转化为字典的简单实现
Jul 07 #Python
全面了解python字符串和字典
Jul 07 #Python
对于Python中RawString的理解介绍
Jul 07 #Python
python变量不能以数字打头详解
Jul 06 #Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 #Python
详解Python中的array数组模块相关使用
Jul 05 #Python
You might like
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
PHP伪造referer实例代码
2008/09/20 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
python 基础教程之Map使用方法
2017/01/17 Python
基于python爬虫数据处理(详解)
2017/06/10 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
Python tkinter模版代码实例
2020/02/05 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
成人继续教育实施方案
2014/03/01 职场文书
小学一年级学生评语
2014/04/22 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
绘画专业自荐信
2014/07/04 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
工程进度款催款函
2015/06/24 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技