collections 模块
collections是Python的一个内建集合模块,提供了许多有用的集合类。
1.deque 双端队列
Deque是一种可以对序列两端元素进行添加和删除操作的基本序列容器,是以双向链表的形式实现的,向deque 两端添加或删除元素的开销很小,它不需要重新分配空间。
方法 | 操作 | 平均时间复杂度 | 最坏时间复杂度 | 备注 |
append(t) | 右侧添加元素t | O(1) | O(1) | wiki |
appendleft(t) | 左侧添加元素t | O(1) | O(1) | wiki |
clear() | 清空所有元素 | O(1) | O(1) | 个人理解 |
copy() | 浅复制 | O(n) | O(n) | wiki |
count(t) | 统计队列中t出现的次数 | O(n) | O(n) | 个人理解 |
extend(t) | 从队列的右侧插入按照列表t的索引顺序,逐个插入t的元素,如扩展是队列超出maxlen,则从另一端抛出多余元素 | O(k) | O(k) | wiki |
extendleft() | 从队列的左侧插入按照列表t的索引顺序,逐个插入t的元素,(每个元素都从左侧开始插入),如扩展是队列超出maxlen,则从另一端抛出多余元素 | O(k) | O(k) | wiki |
index(t [,start [,stop]]) | 返回第一个t的索引(可指定开始、结束区间),如未找到,引发ValueError | 个人理解 | ||
insert(i, x) | 在位置i插入x,如果插入会导致有界双端超出maxlen,则引发IndexError | O(n) | O(n) | 个人理解 |
pop() | 右侧移除并返回一个元素。如果队列为空,引发IndexError | O(1) | O(1) | wiki |
popleft() | 左侧移除并返回一个元素。如果队列为空,引发IndexError | O(1) | O(1) | wiki |
remove(t) | 从队列中移除t,如果t不存在,引发ValueError | O(n) | O(n) | wiki |
reverse() | 原地反转队列,无返回 | O(n) | O(n) | 个人理解 |
rotate(t) | 向右旋转t步(t>0),向左旋转t步(t<0),默认t=1. | O(k) | O(k) | wiki |
maxlen | 一个双端队列的最大大小,如未指定,则任意长度,如果是空队列,则为None | 只读属性 |
(PS:部分方法资料里没有时间复杂度,表中部分时间复杂度为个人看法,备注中已说明)
双端队列支持iteration,pickling,len(d),reversed(d),copy.copy(d),copy.deepcopy(d),成员资格测试操作,下标引用,如d[-1]
。不支持切片,索引访问在两端时间复杂度都是O(1),但在中间减慢到O(n),对于快速随机访问,请改用列表。
部分方法使用代码:
>>>import collections
>>>a = [1, 2, 3, 4, 5]
>>>b = collections.deque(a)
>>>b
deque([1, 2, 3, 4, 5])
>>>print(type(b))
<class 'collections.deque'>
# 添加列表
>>>c = [6, 7, 8]
>>>b.extend(c) # 原列表操作
>>>b
deque([1, 2, 3, 4, 5, 6, 7, 8])
>>>b.extendleft(c)
>>>b
deque([8, 7, 6, 1, 2, 3, 4, 5, 6, 7, 8])
# 旋转
>>>b.rotate(3) # 原列表操作,向右转3步
>>>b
deque([6, 7, 8, 8, 7, 6, 1, 2, 3, 4, 5])
>>>b.rotate(-4) # 左转4步
>>>b
deque([7, 6, 1, 2, 3, 4, 5, 6, 7, 8, 8])
# 创建有界双端队列,最大长度为7
>>>d = collections.deque(a, maxlen=7)
>>>d
deque([1, 2, 3, 4, 5], maxlen=7)
>>>d.extend(c) # 原有5个元素,在右侧添加3个元素
>>>d
deque([2, 3, 4, 5, 6, 7, 8], maxlen=7) # 左侧1个元素被弹出
>>>d.appendleft(0) # 队列左侧添加一个元素
>>>d
deque([0, 2, 3, 4, 5, 6, 7], maxlen=7) # 右侧1个元素被弹出
# 此时如果使用insert插入元素,会引发异常
>>>d.insert(0, 1)
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: deque already at its maximum size
>>>d[1:4] # 双端队列切片,会引发异常
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'
>>>d[3] # 可以使用索引
4
(未完待续)
参考资料:1. https://wiki.python.org/moin/TimeComplexity
2. https://docs.python.org/3/library/collections.html#collections.deque