Python collections 模块学习总结

collections 模块

collections是Python的一个内建集合模块,提供了许多有用的集合类。

1.deque 双端队列

Deque是一种可以对序列两端元素进行添加和删除操作的基本序列容器,是以双向链表的形式实现的,向deque 两端添加或删除元素的开销很小,它不需要重新分配空间。

 

方法操作平均时间复杂度最坏时间复杂度备注
append(t)右侧添加元素t

O(1) 

O(1) 

wiki
appendleft(t)左侧添加元素tO(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,则引发IndexErrorO(n)O(n)个人理解
pop()右侧移除并返回一个元素。如果队列为空,引发IndexErrorO(1)O(1)wiki
popleft()左侧移除并返回一个元素。如果队列为空,引发IndexErrorO(1)O(1)wiki
remove(t)从队列中移除t,如果t不存在,引发ValueErrorO(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值