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对比C语言的编程思想差异
Aug 30 Python
简单谈谈python中的Queue与多进程
Aug 25 Python
浅谈python import引入不同路径下的模块
Jul 11 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
Feb 05 Python
python中in在list和dict中查找效率的对比分析
May 04 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 Python
Python的UTC时间转换讲解
Feb 26 Python
搞清楚 Python traceback的具体使用方法
May 13 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
python 动态调用函数实例解析
Oct 21 Python
Django haystack实现全文搜索代码示例
Nov 28 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
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
javascript 数组排序函数
2009/08/20 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
jQuery中animate的几种用法与注意事项
2016/12/12 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
python如何查看系统网络流量的信息
2016/09/12 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
基于python2.7实现图形密码生成器的实例代码
2019/11/05 Python
python3实现单目标粒子群算法
2019/11/14 Python
python函数超时自动退出的实操方法
2020/12/28 Python
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
股份合作协议书范本
2014/04/14 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
党性观念心得体会
2014/09/03 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
经理岗位职责范本
2015/04/15 职场文书
介绍信格式样本
2015/05/05 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android
MySql分区类型及创建分区的方法
2022/04/13 MySQL