collections模块是数据类型的扩展模块,一些非常重要但平常又不经常使用的数据类型都放在该模块
(一)、单端队列
单端队列的特点:
- 先进先出:一边进另一边出,必须严格按照顺序进行
- 导入模块:import queue
- 实例化单端队列对象:q = queue.Queue()
- 往队列中放入值:q.put(值)
- 查看当前队列的大小:print(q.qsize())
- 获取最先放进去的值:print(q.get())
```python
import queue
q = queue.Queue()
q.put(1)
put()放入值
print(‘大小%s’ % q.qsize()) q.put(‘a’) print(‘大小%s’ % q.qsize()) q.put((1,2,3)) print(‘大小%s’ % q.qsize()) q.put({‘k1’: ‘k2’}) print(‘大小%s’ % q.qsize()) print(q)
print(q.get())获取到的是最先放进去的值:1
‘’’ 结果是: 大小1 大小2 大小3 大小4
‘’’
- 队列外部是看不到内部的排列顺序的,单端队列非常的严格。
<a name="ycpue"></a>
### (二)、双端队列(deque)
- 双端队列两端都是可以进,也可以出,基于这样一个原理,越是先进去的越在双端队列的中间,出去的越晚。
- deque对象的基本操作:
- 导入模块:from collections import deque
- 创建双端队列对象:dq = deque()
- 给队列加值:append()右侧添加, appendleft()左侧添加, insert()往指定的位置加值
- 删除队列中的值:pop()删除末尾的值,popleft()删除左边的值,remove()删除指定的值
- deque对象格式是一个类似于列表类型,拥有列表的删除、增加的功能,但是两者之间存在区别:
- 在insert、remove的时候,deque的平均效率要远远高于列表。
- 列表在根据索引查看某个值的速度要高于deque
- append和pop对于对于列表的速度和效率没有什么影响,如果从开头或者中间去操作,效率影响会很大,所以,实际的工作中列表操作很少会用到insert()和remove()。
```python
from collections import deque
dq = deque()
# 创建双端队列对象
dq.append(1)
dq.append({'k1':'k2'})
# 往队列中添加数据
dq.append(23456)
dq.appendleft('123245')
dq.appendleft((1,2,3,4,5))
print(dq)
# 输出的数据为列表形式
dq.pop()
print(dq)
dq.pop()
print(dq)
dq.remove('123245')
print(dq)
dq.popleft()
print(dq)
dq.insert(1, 1)
print(dq)
'''
deque([(1, 2, 3, 4, 5), '123245', 1, {'k1': 'k2'}, 23456])
deque([(1, 2, 3, 4, 5), '123245', 1, {'k1': 'k2'}])
deque([(1, 2, 3, 4, 5), '123245', 1])
deque([(1, 2, 3, 4, 5), 1])
deque([1])
deque([1, 1])
'''
(三)、创建新的数据类型:namedtuple
namedtuple创建新的数据类型,基本的步骤为:
- 导入包:from collections import namedtuple
- 创建新的类:类名 = namedtuple(‘对类的描述’, [类的参数1, 类的参数2,…])
- 实例化类,创建类对象
- 通过对象.属性调用数据,因为是元组类型,也可以通过下标索引来调用
```python
from collections import namedtuple
Rectagle = namedtuple(‘Ractangle_class’, [‘length’, ‘width’])
类名 = namedtuple(‘对类的描述’, [类的参数名1, 参数名2…])
这个类实际上相当于创建了一个新的数据类型
r = Rectagle(100, 50)实例化类
print(r.length) print(r.width)实例化对象是一个元组,可以通过属性来访问
print(r) print(r[1]) print(r[0])也可以通过下标索引来访问
‘’’ 100 50 Ractangle_class(length=100, width=50) 50 100
‘’’
<a name="95oGm"></a>
### (四)、defaultdict
正常的字典,当调用一个字典中没有的key时程序会报错,但是当通过defaultdict创建的字典如果调用没有字典中没有的key的时候不会报错,会返回一个默认值。<br />具体步骤:
- 导入包:from collections import defaultdict
- 创建字典: d = defaultdict(工厂, k1='v1', k2='v2',...),这里的参数不能加引号
- 调用字典:d['k1'], d['k2'], d['k3']...
- 当调用到字典中不存在的key时,会返回工厂的默认返回值,并且把默认值和查询的key作为key、value添加到字典中去。
- 工厂的类型:
- python已经定义好的数据类型
- 自定义函数,函数不能有参数,直接时return 返回值
```python
'''python定义好的数据类型'''
from collections import defaultdict
d = defaultdict(int, name='alex', age=19)
print(d['name'])
print(d['age'])
print(d['gender'])
'''
alex
19
0
'''
'''自定义函数作为工厂'''
from collections import defaultdict
def func():
return 'dict'
# 函数不能有参数
d = defaultdict(func, name='alex', age=100)
print(d['name'])
print(d['age'])
print(d['gender'])
'''
alex
100
dict
'''
(五)、计数器Counter
通过计数器可以获取对象中每一个元素出现的次数,并以字典的格式来返回, key为元素, value为该元素出现的次数。
具体用法:
- 导入包:from collections import Counter
- 创建计数器对象:c = Counter(需要被计数对象)
- 计数器对象是一个由参数和出现次数作为key、value的字典对象
- 查看出现次数最多的几个参数:c.most_common(num), num表示要查看的前几个参数
- 删除字典对象的最后一位:c.popitem() ```python from collections import Counter
c = Counter([1,2,3,4,5,634,23,44,2,4,25,2,52,6,2,3,2,4,2,4,6,7]) print(c.most_common(4)) print(c) print(c.popitem()) print(c)
‘’’ [(2, 6), (4, 4), (3, 2), (6, 2)] Counter({2: 6, 4: 4, 3: 2, 6: 2, 1: 1, 5: 1, 634: 1, 23: 1, 44: 1, 25: 1, 52: 1, 7: 1}) (7, 1) Counter({2: 6, 4: 4, 3: 2, 6: 2, 1: 1, 5: 1, 634: 1, 23: 1, 44: 1, 25: 1, 52: 1}) ‘’’ ```
注意:放入计数器中的对象必须是可哈希的,即可以迭代的对象