大家都知道python有一些内置的数据类型,比如str, int, tuple, dict, list等。
collections模块在这些基础上,提供了几个额外的数据类型:
1.namedtuple() 生成可以使用名字来访问元素内容的tuple子类(还可用于判断类型)
2.deque(): 双端队列(list长度过长时推荐使用),还可以限定队列长度,适合队列和栈操纵。
3.Counter: 计数器
4.OrderDict: 有序字典
5.defaultDict: 带有默认值的字典
- namedtuple()
namedtuple主要用来产生可以使用名称来访问元素的数据对象,通常用来增强代码的可读性,来可以用来做验证。
例如,一个点的二维坐标就可以表示成:
>>> p = (1, 2)
取值的时候只能通过下标的方式。
定义class又小题大做,这时候namedtuple就派上用场了
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2
>>> isinstance(p, Point)
True
>>> isinstance(p, tuple)
True
# 设置一个圆,x坐标, y坐标,r半径
>>>Circle = namedtuple('Circle', ['x', 'y', 'r'])
2.deque() 双端队列
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
list对象的insert和pop操作的时间复杂度是 O(n) ,也就是说随着元素数量的增加耗时呈 线性上升。而使用deque对象则是 O(1) 的复杂度,所以当你的代码有这样的需求的时候, 一定要记得使用deque
作为一个双端队列,deque还提供了一些其他的好用方法,比如 rotate 等
# -*- coding: utf-8 -*-
"""
下面这个是一个有趣的例子,主要使用了deque的rotate方法来实现了一个无限循环
的加载动画
"""
import sys
import time
from collections import deque
fancy_loading = deque('>--------------------')
while True:
print '\r%s' % ''.join(fancy_loading),
fancy_loading.rotate(1)
sys.stdout.flush()
time.sleep(0.08)
# Result:
# 一个无尽循环的跑马灯
双端队列还可以设置一个最大长度maxlen, 实现先进先出(FIFO)
>>> a = deque(maxlen=3)
>>> a
deque([], maxlen=3)
>>> a.append(1)
>>> a.append(2)
>>> a.append(3)
>>> a
deque([1, 2, 3], maxlen=3)
>>> a.append(4)
>>> a
deque([2, 3, 4], maxlen=3)