Python deque用法介绍

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

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

下面是输出的结果,从结果看好像似乎和普通的list没有多大区别:

Deque: deque(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
Length: 7
Left end: a
Right end: g
remove(c): deque(['a', 'b', 'd', 'e', 'f', 'g'])

不过,下面的例子就可以看到,deque是通过extend方法初始化集合元素的,同时你可以通过extendleft将结合元素从“左边”加入到集合中:

import collections
d1=collections.deque()
d1.extend('abcdefg')
print 'extend:',d1
d1.append('h')
print 'append:',d1
# add to left
d2=collections.deque()
d2.extendleft(xrange(6))
print 'extendleft:',d2
d2.appendleft(6)
print 'appendleft:',d2

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

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

与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
print

其输出结果为:

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

转自:http://www.onepub.net/2011/08/17/python-deque%E7%94%A8%E6%B3%95%E4%BB%8B%E7%BB%8D/

### Python 中 `deque` 的用法 #### 创建双端队列 可以利用 `collections.deque` 来创建一个高效的线程安全的双向队列对象。当初始化时传入可迭代对象,该对象中的每一个元素都会成为新 deque 的一项。 ```python from collections import deque iterable = "123" q = deque(iterable) print(q) # 输出: deque(['1', '2', '3']) ``` 上述代码展示了如何通过字符串作为单一可迭代参数来初始化 deque 对象[^3]。 #### 添加元素到两端 Deque 支持从左端(头部)或右端(尾部)高效地添加和移除元素: - 使用 `.append(x)` 方法向右侧添加单个元素 x; - 使用 `.appendleft(x)` 向左侧添加单个元素 x; ```python d = deque() d.append('a') # 右侧追加 d.appendleft('b') # 左侧追加 print(d) # 输出: deque(['b', 'a']) ``` #### 移除元素 同样可以从任意一端弹出元素: - 调用`.pop()`方法会删除并返回最右边的一个元素; - 如果调用了`.popleft()`, 则是从左边取出第一个元素; ```python item_right = d.pop() # 删除并获取最后一个元素 ('a') item_left = d.popleft() # 删除并获取第一个元素 ('b') ``` #### 扩展 Deque 还可以一次性增加多个元素至指定位置: - `.extend(iterable)` 将 iterable 参数内的所有项依次加入到 deques 的末端; - `.extendleft(iterable)` 把 iterable 内的内容逆序插入到开头处; ```python d.extend(['c','d']) # ['c', 'd']被附加到了最后面 d.extendleft([1,2]) # [2, 1]会被放在最前面 print(d) # 结果为:deque([1, 2, 'c', 'd']) ``` #### 获取长度和其他操作 可以通过内置函数 len() 得知当前容器内有多少个项目; 此外还有旋转(rotating), 清空(clearing),以及拷贝(copying)等功能可供选用. ```python length = len(d) # 返回 deque 长度 d.rotate(1) # 整体循环移动 n 步 (正数表示顺时针方向) copy_of_d = d.copy() # 复制一个新的相同内容的 deque 实例 d.clear() # 移除所有的现存条目 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值