详解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 相关文章推荐
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
Jun 18 Python
python实现在windows下操作word的方法
Apr 28 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
学习Python3 Dlib19.7进行人脸面部识别
Jan 24 Python
PyCharm 设置SciView工具窗口的方法
Jan 15 Python
numpy数组之存取文件的实现示例
May 24 Python
python 获取等间隔的数组实例
Jul 04 Python
django 连接数据库 sqlite的例子
Aug 14 Python
Python判断字符串是否为合法标示符操作
Sep 03 Python
python 写一个性能测试工具(一)
Oct 24 Python
详解Python模块化编程与装饰器
Jan 16 Python
教你使用pyinstaller打包Python教程
May 27 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
检测png图片是否完整的php代码
2010/09/06 PHP
php邮件发送的两种方式
2020/04/28 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
python3使用pandas获取股票数据的方法
2018/12/22 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
Puccini乌克兰:购买行李箱、女士手袋网上商店
2020/08/06 全球购物
绩效专员岗位职责
2013/12/02 职场文书
大学社团活动策划书
2014/01/26 职场文书
工厂保安员岗位职责
2014/01/31 职场文书
内衣营销方案
2014/03/15 职场文书
个人工作主要事迹
2014/05/08 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis
python获取字符串中的email
2022/03/31 Python
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python