详解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 域名分析工具实现代码
Jul 15 Python
Python删除指定目录下过期文件的2个脚本分享
Apr 10 Python
python实现定时同步本机与北京时间的方法
Mar 24 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
Jul 27 Python
python3实现跳一跳点击跳跃
Jan 08 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
python 实现单通道转3通道
Dec 03 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
Python3 搭建Qt5 环境的方法示例
Jul 16 Python
python中pivot()函数基础知识点
Jan 03 Python
Python使用pyenv实现多环境管理
Feb 05 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中使用Oracle数据库(6)
2006/10/09 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[51:06]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第二场 1月26日
2021/03/11 DOTA
Python完全新手教程
2007/02/08 Python
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
Python处理中文标点符号大集合
2018/05/14 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
浅析NumPy 切片和索引
2020/09/02 Python
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
护士检查书
2014/01/17 职场文书
2014年质量工作总结
2014/11/22 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
尊师重教主题班会
2015/08/14 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
一年级下册数学教学反思
2016/02/16 职场文书