deque双向队列
Deque可以从两端添加和删除元素。常用的结构,是它的简化版本。
Deque支持序列的常用操作,现在举一个简单例子,你会发现其实跟平成的list没啥区别:
1 import collections 2 3 dic=collections.deque('abcdefg') 4 print 'deque=',dic 5 print 'Length:',len(dic) 6 print 'Left end:',dic[0] 7 print 'Right end:',dic[-1] 8 dic.remove('c') 9 print 'remove(c):',dic
截图直接贴图了:
是不是发现和list一本一样,只是变成了deque(list),关键是一些基本的用法都一样,来个对比图吧这样更直接些:
1 listTest=['a', 'b', 'c', 'd', 'e', 'f', 'g'] 2 print 'listTest=',listTest 3 print 'Length:',len(listTest) 4 print 'Left end:',listTest[0] 5 print 'Right end:',listTest[-1] 6 listTest.remove('c') 7 print 'remove(c):',listTest
还是直接贴图:
下面的独特之处就来了,双向操作。deque是通过extend方法初始化集合元素的,同时你可以通过extendleft将结合元素从“左边”加入到集合中:
1 import collections 2 d1=collections.deque() 3 d1.extend('abcdefg') #可以列表元素 4 print 'extend:',d1 5 d1.append('h') #只会认为是一个元素加入 6 print 'append:',d1 7 # add to left 8 d2=collections.deque() 9 d2.extendleft(xrange(6)) #从左边加入元素 10 print 'extendleft:',d2 11 d2.appendleft(6) #从左边加入元素 12 print 'appendleft:',d2
d1.append('h') #只会认为是一个元素加入
![](https://i-blog.csdnimg.cn/blog_migrate/a3c7bd1722acd799911484033027518c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f2c2485b65ab5a8a97c539fbf44bd4d3.png)
d1.extend('abcdefg') #可以列表元素
执行结果图:
与append和appendleft方法对应的还有pop和popleft方法分别用于从集合中取出元素,看下面的例子:
1 print "From the right" 2 d1=collections.deque('abcdefg') 3 print 'd1==',d1 4 while True: 5 try: 6 print d1.pop(), 7 except IndexError: 8 break 9 print 10 print '\n From the left' 11 d2=collections.deque(xrange(6)) 12 print 'd2==',d2 13 while True: 14 try: 15 print d2.popleft(), 16 except IndexError: 17 break 18 print
执行结果:
最后值得一提的是,deque是线程安全的,也就是说你可以同时从deque集合的左边和右边进行操作而不会有影响,看下面的代码:
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 '%s : %s' % (direction,next) time.sleep(0.1) print "done %s" % 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()
Queue单向队列
俗话说的好,有单必有双,有双必有单,下面介绍一下单向队列,和上面的双向队列进行对比:
Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
线程安全,只有两种方法,一个放 一个拿。
import Queue
c=Queue.Queue(10) #生成队列的大小
c.put(1)
c.put(2)
c.put(3)
c.get()#一次取出一个,同时删除原有对列中的元素。如果取的时候没有数据,程序会夯筑等待数据