【python】内建模块 collections 小结: namedtuple、deque、OrderedDict、defaultdict、Counter

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)

猜你喜欢

转载自blog.csdn.net/qq_20011607/article/details/81504923