详解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的垃圾回收机制深入分析
Jul 16 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
python3.5 email实现发送邮件功能
May 22 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
python opencv 图像拼接的实现方法
Jun 27 Python
python 实现return返回多个值
Nov 19 Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 Python
Django自关联实现多级联动查询实例
May 19 Python
查看keras的默认backend实现方式
Jun 19 Python
简单的Python人脸识别系统
Jul 14 Python
python3 kubernetes api的使用示例
Jan 12 Python
如何使用Tkinter进行窗口的管理与设置
Jun 30 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
PHP的FTP学习(四)
2006/10/09 PHP
php批量删除数据
2007/01/18 PHP
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
PHP实现把数字ID转字母ID
2013/08/12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
jQuery的一些注意
2006/12/06 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
Vue2 模板template的四种写法总结
2018/02/23 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
Python中列表(list)操作方法汇总
2014/08/18 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
Django csrf 验证问题的实现
2018/10/09 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
remote接口和home接口主要作用
2013/05/15 面试题
最新的互联网创业计划书
2014/01/10 职场文书
《会变的花树叶》教学反思
2014/02/10 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python