分类目录:​​《算法设计与分析》总目录​


我们在​​《栈和队列》​​的文章中介绍了队列。传统的队列实现了一种先进先出的策略,二双向队列的可以实现从队头或者队尾添加或弹出的操作。

class collections.deque([iterable[, maxlen]])

返回一个新的双向队列对象,从​​iterable​​​(迭代对象) 数据创建,从左到右初始化。如果​​iterable​​没有指定,新队列为空。

​Deque​​​队列是由栈或者队列生成的(”double-ended queue”的简称)。​​Deque​​​支持线程安全,内存高效添加(​​append​​​)和弹出(​​pop​​),从两端都可以,两个方向的大概开销都是 O ( 1 ) O(1) O(1)复杂度。

虽然​​list​​​对象也支持类似操作,不过这里优化了定长操作和​​pop(0)​​​和​​insert(0, v)​​的开销。它们引起 O ( n ) O(n) O(n)内存移动的操作,改变底层数据表达的大小和位置。

如果​​maxlen​​​没有指定或者是​​None​​​,​​Deque​​​可以增长到任意长度。否则,​​Deque​​​就限定到指定最大长度。一旦限定长度的​​Deque​​​满了,当新项加入时,同样数量的项就从另一端弹出。限定长度​​Deque​​​提供类似​​Unix filter tail​​的功能。它们同样可以用与追踪最近的交换和其他数据池活动。

双向队列​​Deque​​对象支持以下方法:


  • ​append(x)​​:添加x到右端。
  • ​appendleft(x)​​:添加x到左端。
  • ​clear()​​:移除所有元素,使其长度为0。
  • ​copy()​​:创建一份浅拷贝。
  • ​count(x)​​​:计算​​Deque​​中元素等于x的个数。
  • ​extend(iterable)​​​:扩展​​Deque​​​的右侧,通过添加​​iterable​​参数中的元素。
  • ​extendleft(iterable)​​​:扩展​​Deque​​​的左侧,通过添加​​iterable​​​参数中的元素。注意,左添加时,在结果中​​iterable​​参数中的顺序将被反过来添加。
  • ​index(x[, start[, stop]])​​​:返回x在​​​Deque​​​中的位置(在索引​​start​​​之后,索引​​stop​​​之前)。 返回第一个匹配项,如果未找到则引发​​ValueError​​。
  • ​insert(i, x)​​​:在位置​​i​​​插入x。如果插入会导致一个限长​​​Deque​​​超出长度​​maxlen​​​的话,就引发一个​​IndexError​​。
  • ​pop()​​​:移去并且返回一个元素,​​Deque​​​最右侧的那一个。 如果没有元素的话,就引发一个​​IndexError​​。
  • ​popleft()​​​:移去并且返回一个元素,​​Deque​​​最左侧的那一个。 如果没有元素的话,就引发​​IndexError​​。
  • ​remove(value)​​​:移除找到的第一个​​value​​​。 如果没有的话就引发​​ValueError​​。
  • ​reverse()​​​:将​​Deque​​逆序排列并返回 None 。
  • ​rotate(n=1)​​​:向右循环移动n步。 如果n是负数,就向左循环。如果​​​deque​​​不是空的,向右循环移动一步就等价于​​deque.appendleft(d.pop())​​​, 向左循环一步就等价于​​deque.append(d.popleft())​​。

Deque对象同样提供了一个只读属性:

  • ​maxlen​​​:​​Deque​​​的最大尺寸,如果没有限定的话就是​​None​​ 。

除了以上操作,​​Deque​​​还支持迭代、封存、​​len(deque)​​​、​​reversed(deque)​​​、​​copy.copy(deque)​​​、​​copy.deepcopy(deque)​​​、成员检测运算符​​in​​​以及下标引用例如通过 ​​deque[0]​访问首个元素等。 索引访问在两端的复杂度均为 O ( 1 ) O(1) O(1)但在中间则会低至 O ( n ) O(n) O(n)。 如需快速随机访问,请改用列表。