详解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的单元测试
Apr 28 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
python3实现逐字输出的方法
Jan 23 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
Pycharm 字体大小调整设置的方法实现
Sep 27 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
pycharm下pyqt4安装及环境配置的教程
Apr 24 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
Python获取android设备cpu和内存占用情况
Nov 15 Python
用python修改excel表某一列内容的操作方法
Jun 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里的JS打印函数
2006/10/09 PHP
php格式化金额函数分享
2015/02/02 PHP
PHP的几个常用加密函数
2016/02/03 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
详解Python3中的Sequence type的使用
2015/08/01 Python
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
python三大神器之fabric使用教程
2019/06/10 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
python scipy卷积运算的实现方法
2019/09/16 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
什么是会话Bean
2015/05/14 面试题
毕业生找工作的求职信范文
2013/12/24 职场文书
《自选商场》教学反思
2014/02/14 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
县委务虚会发言材料
2014/10/20 职场文书
中学教师个人总结
2015/02/10 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书