详解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实现list反转实例汇总
Nov 11 Python
python执行子进程实现进程间通信的方法
Jun 02 Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 Python
Python 基础知识之字符串处理
Jan 06 Python
对Python3中的input函数详解
Apr 22 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 Python
Python txt文件加入字典并查询的方法
Jan 15 Python
Python中文编码知识点
Feb 18 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
Django中session进行权限管理的使用
Jul 09 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+javascript液晶时钟
2006/10/09 PHP
CI框架中zip类应用示例
2014/06/17 PHP
php格式化金额函数分享
2015/02/02 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
JS判断数组里是否有重复元素的方法小结
2019/05/21 Javascript
JavaScript 继承 封装 多态实现及原理详解
2019/07/29 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
介绍Python中内置的itertools模块
2015/04/29 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
求职信范文怎么写
2014/01/29 职场文书
企业人事任命书
2014/06/05 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
2014小学年度工作总结
2014/12/20 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
地道战观后感500字
2015/06/04 职场文书
立案决定书范文
2015/06/24 职场文书
2015年大学迎新晚会总结
2015/07/16 职场文书
演讲比赛通讯稿
2015/07/18 职场文书