详解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 28 Python
Python中创建字典的几种方法总结(推荐)
Apr 27 Python
Python实现购物车程序
Apr 16 Python
Python3.x爬虫下载网页图片的实例讲解
May 22 Python
python爬取哈尔滨天气信息
Jul 14 Python
python调用百度REST API实现语音识别
Aug 30 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
如何在Python中实现goto语句的方法
May 18 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
Python 绘制多因子柱状图
May 11 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之curl实现http与https请求的方法
2014/10/21 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
js select实现省市区联动选择
2020/04/17 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
web.py获取上传文件名的正确方法
2014/08/26 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
python pygame实现方向键控制小球
2019/05/17 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
外语学院毕业生的自我鉴定
2013/11/28 职场文书
销售经理工作职责范文
2013/12/03 职场文书
户籍证明的格式
2014/01/13 职场文书
2014年党务公开实施方案
2014/02/27 职场文书
员工工作及收入证明
2014/10/28 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
Python实现的扫码工具居然这么好用!
2021/06/07 Python
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers