详解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解释执行原理分析
Aug 22 Python
python实现机器人行走效果
Jan 29 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
matplotlib给子图添加图例的方法
Aug 03 Python
Python设计模式之职责链模式原理与用法实例分析
Jan 11 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
Jun 28 Python
python设计tcp数据包协议类的例子
Jul 23 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
Aug 12 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
python新手学习可变和不可变对象
Jun 11 Python
python从Oracle读取数据生成图表
Oct 14 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中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
Python输出9*9乘法表的方法
2015/05/25 Python
python WindowsError的错误代码详解
2017/07/23 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
python实现三维拟合的方法
2018/12/29 Python
Django框架模板介绍
2019/01/15 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
实例讲解Python3中abs()函数
2019/02/19 Python
Python3远程监控程序的实现方法
2019/07/15 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
python已协程方式处理任务实现过程
2019/12/27 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
自荐信格式写作方法有哪些呢
2013/11/20 职场文书
团队精神口号
2014/06/06 职场文书
停车场管理协议书范本
2014/10/08 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android