赞
踩
- #基本语法
- class collections.deque([iterable[, maxlen]])
返回一个从左到右初始化的新 deque 对象(使用 append()
),其中包含来自可迭代对象的数据。如果未指定 iterable,则新 deque 为空。
Deques 是堆栈和队列的泛化(名称发音为“deck”,是“双端队列”的缩写)。Deques 支持线程安全、内存高效的追加和弹出,从 deque 的任一侧,在任一方向上都具有大致相同的 O(1) 性能。
尽管 list
对象支持类似的操作,但它们针对快速固定长度操作进行了优化,并且 pop(0)
和 insert(0, v)
操作会产生 O(n) 内存移动成本,这些操作会更改基础数据表示的大小和位置。
如果未指定 maxlen 或为 None
,则 deques 可能会增长到任意长度。否则,deque 将绑定到指定的最大长度。一旦有界长度的 deque 已满,当添加新项目时,将从另一端丢弃相应数量的项目。边界长度 deques 提供的功能类似于 Unix 中的 tail
过滤器。它们对于跟踪交易和其他数据池也很有用,其中只有最近的活动才感兴趣。
Deque 对象支持以下方法:
append(x):将 x 添加到 deque 的右侧。
appendleft(x):将 x 添加到 deque 的左侧。
clear():从设计中删除所有元素,使其长度为 0。
copy():创建 deque 的浅拷贝。
count(x):计算等于 x 的 deque 元素的数量。
extend(iterable):通过附加可迭代参数中的元素来扩展 deque 的右侧。
extendleft(iterable):通过附加 iterable 中的元素来扩展 deque 的左侧。请注意,一系列左追加会导致可迭代参数中元素的顺序颠倒。
index(x[, start[, stop]]):返回 x 在 deque 中的位置(在索引开始或之后以及索引停止之前)。返回第一个匹配项,如果未找到,则引发
ValueError
。insert(i, x):将 x 插入位置 i 处的 deque。如果插入会导致有界的 deque 增长到 maxlen 以上,则会引发
IndexError
。pop():从 deque 的右侧删除并返回一个元素。如果不存在任何元素,则引发
IndexError
。popleft():从 deque 的左侧删除并返回一个元素。如果不存在任何元素,则引发
IndexError
。remove(value):删除第一个出现的值。如果未找到,则引发
ValueError
。reverse():就地反转 deque 的元素,然后返回
None
。rotate(n=1):向右旋转 deque n 步。如果 n 为负数,则向左旋转。当 deque 不为空时,向右旋转一步等于
d.appendleft(d.pop())
,向左旋转一步等于d.append(d.popleft())
。Deque 对象还提供一个只读属性:
maxlen:deque 或
None
的最大大小(如果无界)。
除上述内容外,deques 还支持迭代、封装、 len(d)
、 reversed(d)
、 copy.copy(d)
、 copy.deepcopy(d)
、使用 in
运算符进行成员资格测试,以及 d[0]
等下标引用来访问第一个元素。索引访问在两端为 O(1),但在中间减慢到 O(n)。要进行快速随机访问,请改用列表。
从版本 3.5 开始,deques 支持 __add__()
, __mul__()
和 __imul__()
。
- from collections import deque
-
- d = deque('ghi')
- for elem in d:
- print(elem.upper())
-
- d.append('j')
- print(d)
-
- d.appendleft('f')
- print(d)
-
- print(d.pop())
- print(d.popleft())
- print(list(d))
-
- print(d[0])
- print(d[-1])
-
- print(list(reversed(d)))
-
- print('h' in d)
-
- d.extend('jkl')
- print(d)
-
- d.rotate(1)
- print(d)
-
- d.rotate(-1)
- print(d)
-
-
- print(deque(reversed(d)))
-
- d.clear()
- print(d)
'运行
有界长度 deques 提供的功能类似于 Unix 中的 tail
过滤器:
- from collections import deque
- def tail(filename, n=10):
- 'Return the last n lines of a file'
- with open(filename) as f:
- return deque(f, n)
'运行
使用 deques 的另一种方法是通过向右追加并向左弹出来维护最近添加的元素序列:
循环调度器可以通过存储在 deque
中的输入迭代器来实现。值由位置为零的活动迭代器生成。如果该迭代器已用尽,则可以使用 popleft()
将其删除;否则,可以使用 rotate()
方法将其循环回末尾。
rotate()
方法提供了一种实现 deque
切片和删除的方法。例如, del d[n]
的纯 Python 实现依赖于 rotate()
方法来定位要弹出的元素:
若要实现 deque
切片,请使用类似的方法应用 rotate()
将目标元素带到 deque 的左侧。使用 popleft()
删除旧条目,使用 extend()
添加新条目,然后反转旋转。通过对该方法的细微变化,很容易实现 Forth 样式堆栈操作,例如 dup
, drop
, swap
, over
, pick
, rot
和 roll
。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。