Python内置了一些常用的数据类型,如str, int, list, tuple, dict等,而collections模块则在这个基础上提供了几个额外的小众的数据类型,在一些场景下会达到事半功倍的效果。具体如下:
数据类型 | 功能 |
---|---|
namedtuple() | 生成可以使用名字来访问元素内容的tuple子类 |
deque() | 双端队列,可以快速的从另外一侧追加和推出对象 |
Counter() | 计数器,主要用来计数 |
OrderedDict() | 有序字典 |
defaultdict() | 带有默认值的字典 |
namedtuple
功能
有名字的tuple。tuple只能通过索引的方式调用,而namedtuple可以根据属性调用。即 tuple的不变性 + 属性引用
使用方法
定义: 类名 = namedtuple('数据类型名' ,['属性1','属性2','属性3','属性4',...])
实例化: 实例对象 = 类名(属性1的值,属性2的值,...)
调用: 实例对象.属性2
例 1
定义一个坐标 p(x,y),想通过p.x获取横坐标,p.y 获取纵坐标,怎么办呢?定义一个类可以,但有点小题大做。可以这样:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
调用:
>>> p
Point(x=1, y=2)
>>> p.x
1
>>> p.y
2
不可赋值
>>> p.x = 3
Traceback (most recent call last):
File "<ipython-input-25-54b6a9d37b64>", line 1, in <module>
p.x = 3
AttributeError: can't set attribute
可调用不可赋值:此时p是Point类的一个实例对象,可用类属性的方式调用。但namedtuple本质还是一个tuple,故属性值不可变。
可以验证创建的Point对象是tuple的一种子类:
>>> isinstance(p, Point)
True
>>> isinstance(p, tuple)
True
例 2
from collections import namedtuple
websites = [ ('Sohu', 'http://www.sohu.com/', u'张朝阳'),
('Sina', 'http://www.sina.com.cn/', u'王志东'),
('163', 'http://www.163.com/', u'丁磊') ]
# 用namedtuple自定义一个Website类
Website = namedtuple('Website', ['name', 'url', 'founder'])
for website in websites:
website = Website._make(website) # ._make():把tuple装进去,即实例化
print(website)
print(website.name)
print(website.url)
print(website.founder)
输出
[Out]:
Website(name='Sohu', url='http://www.sohu.com/', founder='张朝阳')
Sohu
http://www.google.com/
张朝阳
Website(name='Sina', url='http://www.sina.com.cn/', founder='王志东')
Sina
http://www.sina.com.cn/
王志东
Website(name='163', url='http://www.163.com/', founder='丁磊')
163
http://www.163.com/
丁磊
未完待续。。。
Ref:
collections - 廖雪峰的官方网站
不可不知的Python模块: collections
容器(Collections)