Python collections 模块学习总结

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

(未完待续)

扫描二维码关注公众号,回复: 3979316 查看本文章

参考资料:1. https://wiki.python.org/moin/TimeComplexity

                  2. https://docs.python.org/3/library/collections.html#collections.deque

猜你喜欢

转载自blog.csdn.net/qq_34172340/article/details/81748089