详解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调用C/C++动态链接库的方法详解
Jul 22 Python
朴素贝叶斯算法的python实现方法
Nov 18 Python
Python利用ElementTree模块处理XML的方法详解
Aug 31 Python
python如何实现int函数的方法示例
Feb 19 Python
解决python "No module named pip" 的问题
Oct 13 Python
Python3爬虫使用Fidder实现APP爬取示例
Nov 27 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
Python实现自动签到脚本功能
Aug 20 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
PyQt5通过信号实现MVC的示例
Feb 06 Python
Python import模块的缓存问题解决方案
Jun 02 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站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
php实现天干地支计算器示例
2014/03/14 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
28个JS验证函数收集
2010/03/02 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
如何客观的进行自我评价
2013/12/17 职场文书
应届毕业生自我鉴定范文
2013/12/27 职场文书
老干部工作先进事迹
2014/08/17 职场文书
2015大学生实训报告
2014/11/05 职场文书
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android