Python collections模块实例讲解


Posted in Python onApril 07, 2014

collections模块基本介绍

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

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

namedtuple()

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

举个栗子

# -*- coding: utf-8 -*-
"""
比如我们用户拥有一个这样的数据结构,每一个对象是拥有三个元素的tuple。
使用namedtuple方法就可以方便的通过tuple来生成可读性更高也更好用的数据结构。
"""
from collections import namedtuple
websites = [
    ('Sohu', 'http://www.google.com/', u'张朝阳'),
    ('Sina', 'http://www.sina.com.cn/', u'王志东'),
    ('163', 'http://www.163.com/', u'丁磊')
]
Website = namedtuple('Website', ['name', 'url', 'founder'])
for website in websites:
    website = Website._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 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:
# 一个无尽循环的跑马灯
------------->-------

Counter

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

举个栗子

# -*- coding: utf-8 -*-
"""
下面这个例子就是使用Counter模块统计一段句子里面所有字符出现次数
"""
from collections import Counter
s = '''A Counter is a dict subclass for counting hashable objects. It is an unordered collection where elements are stored as dictionary keys and their counts are stored as dictionary values. Counts are allowed to be any integer value including zero or negative counts. The Counter class is similar to bags or multisets in other languages.'''.lower()
c = Counter(s)
# 获取出现频率最高的5个字符
print c.most_common(5)
# Result:
[(' ', 54), ('e', 32), ('s', 25), ('a', 24), ('t', 24)]

OrderedDict

在Python中,dict这个数据结构由于hash的特性,是无序的,这在有的时候会给我们带来一些麻烦, 幸运的是,collections模块为我们提供了OrderedDict,当你要获得一个有序的字典对象时,用它就对了。

举个栗子

# -*- coding: utf-8 -*-
from collections import OrderedDict
items = (
    ('A', 1),
    ('B', 2),
    ('C', 3)
)
regular_dict = dict(items)
ordered_dict = OrderedDict(items)
print 'Regular Dict:'
for k, v in regular_dict.items():
    print k, v
print 'Ordered Dict:'
for k, v in ordered_dict.items():
    print k, v
# Result:
Regular Dict:
A 1
C 3
B 2
Ordered Dict:
A 1
B 2
C 3

defaultdict

我们都知道,在使用Python原生的数据结构dict的时候,如果用 d[key] 这样的方式访问, 当指定的key不存在时,是会抛出KeyError异常的。

但是,如果使用defaultdict,只要你传入一个默认的工厂方法,那么请求一个不存在的key时, 便会调用这个工厂方法使用其结果来作为这个key的默认值。

# -*- coding: utf-8 -*-
from collections import defaultdict
members = [
    # Age, name
    ['male', 'John'],
    ['male', 'Jack'],
    ['female', 'Lily'],
    ['male', 'Pony'],
    ['female', 'Lucy'],
]
result = defaultdict(list)
for sex, name in members:
    result[sex].append(name)
print result
# Result:
defaultdict(<type 'list'>, {'male': ['John', 'Jack', 'Pony'], 'female': ['Lily', 'Lucy']})

参考资料

上面只是非常简单的介绍了一下collections模块的主要内容,主要目的就是当你碰到适合使用 它们的场所时,能够记起并使用它们,起到事半功倍的效果。

如果要对它们有一个更全面和深入了解的话,还是建议阅读官方文档和模块源码。

https://docs.python.org/2/library/collections.html#module-collections

Python 相关文章推荐
使用Python的PEAK来适配协议的教程
Apr 14 Python
python中list常用操作实例详解
Jun 03 Python
Python实现爬取需要登录的网站完整示例
Aug 19 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
pyQt5实时刷新界面的示例
Jun 25 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
Aug 05 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
Python产生一个数值范围内的不重复的随机数的实现方法
Aug 21 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
Python sublime安装及配置过程详解
Jun 29 Python
Python可视化工具如何实现动态图表
Oct 23 Python
python操作xml文件示例
Apr 07 #Python
python生成随机验证码(中文验证码)示例
Apr 03 #Python
python读取html中指定元素生成excle文件示例
Apr 03 #Python
python实现zencart产品数据导入到magento(python导入数据)
Apr 03 #Python
python模拟登陆阿里妈妈生成商品推广链接
Apr 03 #Python
python多线程抓取天涯帖子内容示例
Apr 03 #Python
python局域网ip扫描示例分享
Apr 03 #Python
You might like
PHP实现抓取HTTPS内容
2014/12/01 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
Yii框架批量插入数据扩展类的简单实现方法
2017/05/23 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
JavaScript面向对象编程
2008/03/02 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
2016/12/29 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
Python写的一个简单DNS服务器实例
2014/06/04 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
使用Python对Access读写操作
2017/03/30 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
JSF的标签库有哪些
2012/04/27 面试题
企业行政文员岗位职责
2013/12/03 职场文书
原材料检验岗位职责
2014/03/15 职场文书
信息管理专业自荐书
2014/06/05 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
酒店开业主持词
2015/07/02 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书