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脚本
Apr 05 Python
浅谈Python处理PDF的方法
Nov 10 Python
Python numpy实现数组合并实例(vstack,hstack)
Jan 09 Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 Python
使用pandas批量处理矢量化字符串的实例讲解
Jul 10 Python
不知道这5种下划线的含义,你就不算真的会Python!
Oct 09 Python
python tools实现视频的每一帧提取并保存
Mar 20 Python
python elasticsearch从创建索引到写入数据的全过程
Aug 04 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
Python HTTP下载文件并显示下载进度条功能的实现
Apr 02 Python
python使用openpyxl库读写Excel表格的方法(增删改查操作)
May 02 Python
Python实现归一化算法详情
Mar 18 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
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
vue组件间通信解析
2017/03/01 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
js实现文章目录索引导航(table of content)
2020/05/10 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
用Python输出一个杨辉三角的例子
2014/06/13 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
设计师珠宝:Ylang 23
2018/05/11 全球购物
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
医院节能减排方案
2014/06/13 职场文书
公司员工安全协议书
2014/11/21 职场文书
宪法宣传标语100条
2019/10/15 职场文书
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android