详解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脚本生成Android SALT扰码的方法
Sep 18 Python
Python 冒泡,选择,插入排序使用实例
Feb 05 Python
分析用Python脚本关闭文件操作的机制
Jun 28 Python
用Python解决计数原理问题的方法
Aug 04 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
Aug 08 Python
python 巧用正则寻找字符串中的特定字符的位置方法
May 02 Python
python制作英语翻译小工具代码实例
Sep 09 Python
matplotlib实现显示伪彩色图像及色度条
Dec 07 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
Feb 03 Python
详解Python 中的容器 collections
Aug 17 Python
利用For循环遍历Python字典的三种方法实例
Mar 25 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.MVC的模板标签系统(二)
2006/09/05 PHP
php之对抗Web扫描器的脚本技巧
2008/10/01 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
jQuery实现购物车表单自动结算效果实例
2015/08/10 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
2018/04/17 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
贫困证明书格式及范文
2014/10/15 职场文书
房产公证书格式
2015/01/26 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书