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黑魔法@property装饰器的使用技巧解析
Jun 16 Python
分数霸榜! python助你微信跳一跳拿高分
Jan 08 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
python开发游戏的前期准备
May 05 Python
对PyQt5的输入对话框使用(QInputDialog)详解
Jun 25 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
Oct 14 Python
python用类实现文章敏感词的过滤方法示例
Oct 27 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
Jun 23 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 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 加密与解密的斗争
2009/04/17 PHP
php利用header函数下载各种文件
2016/08/24 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
2016/11/23 Javascript
JS模拟实现哈希表及应用详解
2018/05/04 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
python PyTorch参数初始化和Finetune
2018/02/11 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
2019/08/22 Python
Pythonic版二分查找实现过程原理解析
2020/08/11 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
Unix控制后台进程都有哪些进程
2016/09/22 面试题
《郑和远航》教学反思
2014/04/16 职场文书
节能宣传周活动总结
2014/05/08 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
医德医魂心得体会
2014/09/11 职场文书
党员民主评议个人总结
2014/10/20 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android
Python实现老照片修复之上色小技巧
2021/10/16 Python