详解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模块学习 filecmp 文件比较
Aug 27 Python
使用python的chardet库获得文件编码并修改编码
Jan 22 Python
python实现将汉字转换成汉语拼音的库
May 05 Python
python snownlp情感分析简易demo(分享)
Jun 04 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
python3下pygame如何实现显示中文
Jan 11 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
python基础之while循环语句的使用
Apr 20 Python
基于Python实现一个春节倒计时脚本
Jan 22 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获取mysql字段名称和其它信息的例子
2014/04/14 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
Python实现的一个简单LRU cache
2014/09/26 Python
python调用百度REST API实现语音识别
2018/08/30 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
python查看数据类型的方法
2019/10/12 Python
Python 音频生成器的实现示例
2019/12/24 Python
Python range与enumerate函数区别解析
2020/02/28 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
Python实现微信表情包炸群功能
2021/01/28 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
保险专业大专生求职信
2013/10/26 职场文书
4s客服专员岗位职责
2013/12/01 职场文书
搬家公司的创业计划书
2014/01/01 职场文书
村党支部书记承诺书
2014/05/29 职场文书
旅游文化节策划方案
2014/06/06 职场文书
python 爬取天气网卫星图片
2021/06/07 Python
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸