详解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 19 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
Mar 19 Python
python利用百度AI实现文字识别功能
Nov 27 Python
python后端接收前端回传的文件方法
Jan 02 Python
pandas如何处理缺失值
Jul 31 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
Python操作qml对象过程详解
Sep 26 Python
python对Excel的读取的示例代码
Feb 14 Python
python基础详解之if循环语句
Apr 24 Python
pandas中DataFrame重置索引的几种方法
May 24 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 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
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
2017/11/17 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
python django事务transaction源码分析详解
2017/03/17 Python
在django中使用自定义标签实现分页功能
2017/07/04 Python
Python中的Numpy矩阵操作
2018/08/12 Python
python中字符串内置函数的用法总结
2018/09/13 Python
使用PyCharm创建Django项目及基本配置详解
2018/10/24 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
详解Python流程控制语句
2020/10/28 Python
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
自考生自我鉴定范文
2013/10/01 职场文书
一名毕业生的自我鉴定
2013/12/04 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
会员活动策划方案
2014/08/19 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
招商引资工作汇报
2014/10/28 职场文书
食品安全主题班会
2015/08/13 职场文书
高中生物教学反思
2016/02/20 职场文书
Selenium浏览器自动化如何上传文件
2022/04/06 Python