deque队列是由栈或者queue队列生成的,支持线程安全(也就是说你可以同时从deque集合的左边和右边进行操作而不会有影响),从两端都可以高效的添加(append)和弹出(pop)元素,两个方向的大概开销都是 O(1) 复杂度。
在创建时,可以指定最大长度collections.deque(maxlen=x)
,如果 maxlen 没有指定或者是 None
,deques 可以增长到任意长度。否则,deque就限定到指定最大长度,当deque满了,有新项加入时,同样数量的项就从另一端弹出。
1 | In [1]: import collections |
双向队列(deque)对象支持以下方法:
append(x)
添加 x 到右端appendleft(x)
添加x到左端pop()
移去并且返回最右侧的元素,如果没有元素的话,就抛出IndexError
索引错误。popleft()
移去并且返回最左侧的元素,如果没有元素的话,就抛出IndexError
索引错误。clear()
移除所有元素,使其长度为0remove(x)
移去找到的第一个 value。 如果没有,抛出ValueError
copy()
创建一份浅拷贝count()
计算等于 x 的元素个数extend(iterable)
将iterable中的元素添加到deque的右侧extendleft(iterable)
将iterable中的元素添加到deque的左侧,在结果中iterable中的顺序将被反过来添加。index(x[, start[, stop]])
返回第一个匹配的第 x 个元素(从 start 开始计算,在 stop 之前),如果没找到的话,抛出ValueError
insert(i, x)
在i位置插入x,如果插入会导致deque超出长度 maxlen 的话,就抛出IndexError
索引错误reverse()
将deque逆序排列。返回None
。rotate(n=1)
向右循环移动 n 步。 如果 n 是负数,就向左循环。如果deque不是空的,向右循环移动一步就等价于d.appendleft(d.pop())
, 向左循环一步就等价于d.append(d.popleft())
。
除了以上的方法,deque还支持迭代、成员测试、下标引用(d[-1])等等:
1 | In [1]: import collections |
参考: