zoukankan      html  css  js  c++  java
  • 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  
    转自别处。。为方便日后学习。
  • 相关阅读:
    sql查询重复记录、删除重复记录方法大全
    查询字段所在的表/视图
    查询某张表被哪些存储过程或者视图用到的sql语句
    SQL中char、varchar、nvarchar的区别
    JS快速获取图片宽高的方法
    Git代码冲突常见解决方法
    HTML__图片轮播ion-slide-box
    oracle列出两个日期间所有日期
    myeclipse 8.0 注册码
    网页中图片旋转的几种实现方式
  • 原文地址:https://www.cnblogs.com/lovemo1314/p/2718176.html
Copyright © 2011-2022 走看看