首页 > 代码库 > collections 模块(namedtuple, deque, Counter )

collections 模块(namedtuple, deque, Counter )

基本介绍

我们都知道,Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型:

namedtuple(): 生成可以使用名字来访问元素内容的tuple子类deque: 双端队列,可以快速的从另外一侧追加和推出对象Counter: 计数器,主要用来计数OrderedDict: 有序字典defaultdict: 带有默认值的字典

namedtuple()

namedtuple主要用来产生可以使用名称来访问元素的数据对象,通常用来增强代码的可读性, 在访问一些tuple类型的数据时尤其好用。

# -*- coding: utf-8 -*-"""比如我们用户拥有一个这样的数据结构,每一个对象是拥有三个元素的tuple。使用namedtuple方法就可以方便的通过tuple来生成可读性更高也更好用的数据结构。"""from collections import namedtuplewebsites = [    (Sohu, http://www.google.com/, u张朝阳),    (Sina, http://www.sina.com.cn/, u王志东),    (163, http://www.163.com/, u丁磊)]title = namedtuple(Website, [name, url, founder])for website in websites:    website = title._make(website)    print website# Result:Website(name=Sohu, url=http://www.google.com/, founder=u\u5f20\u671d\u9633)Website(name=Sina, url=http://www.sina.com.cn/, founder=u\u738b\u5fd7\u4e1c)Website(name=163, url=http://www.163.com/, founder=u\u4e01\u78ca)

deque

deque其实是 double-ended queue 的缩写,翻译过来就是双端队列,它最大的好处就是实现了从队列 头部快速增加和取出对象: .popleft().appendleft() 。

你可能会说,原生的list也可以从头部添加和取出对象啊?就像这样:

l.insert(0, v)l.pop(0)

 

但是值得注意的是,list对象的这两种用法的时间复杂度是 O(n) ,也就是说随着元素数量的增加耗时呈 线性上升。而使用deque对象则是 O(1) 的复杂度,所以当你的代码有这样的需求的时候, 一定要记得使用deque。

作为一个双端队列,deque还提供了一些其他的好用方法,比如 rotate 等。

# -*- coding: utf-8 -*-"""下面这个是一个有趣的例子,主要使用了deque的rotate方法来实现了一个无限循环的加载动画"""import sysimport timefrom collections import dequefancy_loading = deque(>--------------------)while True:    print \r%s % ‘‘.join(fancy_loading),    fancy_loading.rotate(1)    sys.stdout.flush()    time.sleep(0.08)# Result:# 一个无尽循环的跑马灯------------->-------

 

Counter

计数器是一个非常常用的功能需求,collections也贴心的为你提供了这个功能。

若要详细使用过程:http://www.pythoner.com/205.html

1.创建

技术分享

 

 2.返回一个TopN列表。如果n没有被指定,则返回所有元素。当多个元素计数值相同时,按照字母序排列。

 技术分享

 

collections 模块(namedtuple, deque, Counter )