python deque用法

Python中的collentions中有一个deque,这个对象类似于list列表,但是使用list存储数据是,按索引访问元素很快,但是插入和删除就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

但是deque是为了实现插入和删除操作的双向列表,适用于队列和栈:

下面演示下deque的节本用法:

输入:

import collections
d=collections.deque('abcdefg')
print 'Deque:',d
print 'Length:',len(d)
print 'Left end:',d[0]
print 'Right end:',d[-1]
 
d.remove('c')
print 'remove(c):',d

输出:

Deque: deque(['1', '2', '3', '4', '6', '7', '8'])
Length: 7
Left end: 1
Right end: 8
remove(3): deque(['1', '2', '4', '6', '7', '8'])

仔细看上面输出代码,好像和list没什么区别

下面的例子能看到,deque是通过extend方法初始化集合元素,同时可以通过extendleft将结合元素从左边加到集合

import collections
d1 = collections.deque()
d1.extend(range(7))
print('extend:',d1)
d1.append('7')
print('append:',d1)
#从右边添加
d2 = collections.deque()
d2.extendleft('abcdef')
print('extendleft:',d2)
d2.appendleft('h')
print('appendleft:',d2)

输出:

extend: deque([0, 1, 2, 3, 4, 5, 6])
append: deque([0, 1, 2, 3, 4, 5, 6, '7'])
extendleft: deque(['f', 'e', 'd', 'c', 'b', 'a'])
appendleft: deque(['h', 'f', 'e', 'd', 'c', 'b', 'a'])

从输出结果看,append默认从集合的右边增加数组元素,而另一个appendleft可以从集合的左边增加元素

deque的maxlen 是一个可选参数, 代表这个队列可以容纳的元素的数量, 而
且一旦设定, 这个属性就不能修改了

>>> from collections import deque
>>> dq = deque(range(10), maxlen=10) ➊
>>> dq
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
>>> dq.rotate(3) ➋
>>> dq
deque([7, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10)
>>> dq.rotate(-4)

 

 

 

与append和appendleft方法对应的还有pop和popleft方法分别用于从集合中取出元素,看下面的例子:


import collections
print "From the right"
d=collections.deque('abcdefg')
while True:
    try:
        print d.pop(),
    except IndexError:
        break
print
 
print '\n From the left'
d=collections.deque(xrange(6))
while True:
    try:
        print d.popleft(),
    except IndexError:
        break

输出:

From the right
g f e d c b a
 
 From the left
0 1 2 3 4 5

 

最后值得一提的是,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()

为了试验线程安全,我们分别起了两个线程从deque的左边和右边开始移出集合元素,其输出结果如下:

left : 0
right : 4
right : 3left : 1
 
left : 2
done right
done left

 

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值