zoukankan      html  css  js  c++  java
  • collection系列用法-deque双向队列

    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') #只会认为是一个元素加入

    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 '
     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就表示队列长度无限。

    创建一个 队列 对象 最大长度为10

    线程安全,只有两种方法,一个放 一个拿。
    import Queue
    c=Queue.Queue(10) #生成队列的大小
    c.put(1)
    c.put(2)
    c.put(3)
    c.get()#一次取出一个,同时删除原有对列中的元素。如果取的时候没有数据,程序会夯筑等待数据

    Queue的常用方法:
       Queue.qsize() #返回队列的大小 
       Queue.empty() #如果队列为空,返回True,反之False 
       Queue.full()  #如果队列满了,返回True,反之False
       Queue.full 与 maxsize 大小对应 
       Queue.get([block[, timeout]]) #获取队列,timeout等待时间,调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且 block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 
       Queue.get_nowait() #相当Queue.get(False)
       Queue.put(item)    #非阻塞写入队列,timeout等待时间,调用队列对象的put()方法在队尾插入一个项目。
       put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
       Queue.put_nowait(item) #相当Queue.put(item, False)
       Queue.task_done()   #在完成一项工作之后,Queue.task_done() 函数向任务已经完成的队列发送一个信号Queue.join() 实际上意味着等到队列为空,再执行别的操作.
     
    参考文章:http://blog.itpub.net/22664653/viewspace-764044/
  • 相关阅读:
    CentOS6.5卸载自带的Mysql软件
    Oracle 监听hang住
    mysql忘记root登录密码
    根据linux自带的JDK,配置JAVA_HOME目录
    nbu还原集群数据库异常问题
    Oracle11g RAC安装
    linux系统安装步骤
    oracle11g安装补丁升级
    linux系统安装Oracle11g详细步骤
    Express之Hello World示例
  • 原文地址:https://www.cnblogs.com/chushiyaoyue/p/5316641.html
Copyright © 2011-2022 走看看