• python deque


    Python的collections中有一个deque,这个对象类似于list列表,不过你可以操作它的“两端”。比如下面的例子:

    1. import collections  
    2. d=collections.deque('abcdefg')  
    3. print 'Deque:',d  
    4. print 'Length:',len(d)  
    5. print 'Left end:',d[0]  
    6. print 'Right end:',d[-1]  
    7.   
    8. d.remove('c')  
    9. print 'remove(c):',d  
    下面是输出的结果,从结果看好像似乎和普通的list没有多大区别:
    1. Deque: deque(['a', 'b', 'c', 'd', 'e', 'f', 'g'])  
    2. Length: 7  
    3. Left end: a  
    4. Right end: g  
    5. remove(c): deque(['a', 'b', 'd', 'e', 'f', 'g'])  
    不过,下面的例子就可以看到,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  
    从输出的结果,我们可以看到,append默认从集合的右边增加数组元素,而另一个appendleft可以从集合的左边增加元素,输出结果如下:
    1. extend: deque(['a', 'b', 'c', 'd', 'e', 'f', 'g'])  
    2. append: deque(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])  
    3. extendleft: deque([5, 4, 3, 2, 1, 0])  
    4. appendleft: deque([6, 5, 4, 3, 2, 1, 0])  
    与append和appendleft方法对应的还有pop和popleft方法分别用于从集合中取出元素,看下面的例子:
    1. import collections  
    2. print "From the right"  
    3. d=collections.deque('abcdefg')  
    4. while True:  
    5.     try:  
    6.         print d.pop(),  
    7.     except IndexError:  
    8.         break  
    9. print  
    10.   
    11. print '\n From the left'  
    12. d=collections.deque(xrange(6))  
    13. while True:  
    14.     try:  
    15.         print d.popleft(),  
    16.     except IndexError:  
    17.         break  
    18. print  
    其输出结果为:
    1. From the right  
    2. g f e d c b a  
    3.   
    4.  From the left  
    5. 0 1 2 3 4 5  
    最后值得一提的是,deque是线程安全的,也就是说你可以同时从deque集合的左边和右边进行操作而不会有影响,看下面的代码:
    1. import collections  
    2. import threading  
    3. import time  
    4. candle=collections.deque(xrange(5))  
    5. def burn(direction,nextSource):  
    6.     while True:  
    7.         try:  
    8.             next=nextSource()  
    9.         except IndexError:  
    10.             break  
    11.         else:  
    12.             print '%s : %s' % (direction,next)  
    13.             time.sleep(0.1)  
    14.     print "done %s" % direction  
    15.     return  
    16. left=threading.Thread(target=burn,args=('left',candle.popleft))  
    17. right=threading.Thread(target=burn,args=('right',candle.pop))  
    18.   
    19. left.start()  
    20. right.start()  
    21.   
    22. left.join()  
    23. right.join()  
    为了试验线程安全,我们分别起了两个线程从deque的左边和右边开始移出集合元素,其输出结果如下:
    1. left : 0  
    2. right : 4  
    3. right : 3left : 1  
    4.   
    5. left : 2  
    6. done right  
    7. done left  
    转自别处。。为方便日后学习。
  • 相关阅读:
    1202诗人基本介绍&诗人画像
    1205人物关系优化&诗人轨迹
    把SQL Server 2000 表中的自动编号Id重新开始排列
    一个一直都不明白的东西今天知道了。关于sqlserver2000自动执行。
    服装打版界的扛把子ET自定义操作
    手把手教你搭建集中式版本控制系统SVN服务器
    分享一次实用的爬虫经验
    盘点CSV文件在Excel中打开后乱码问题的两种处理方法
    盘点服装设计所经常性使用的软件ET(下篇)
    sql 每个企业选择一条产品
  • 原文地址:https://www.cnblogs.com/lovemo1314/p/2718176.html
Copyright © 2020-2023  润新知