使用Python的内建模块collections的教程


Posted in Python onApril 28, 2015

collections是Python内建的一个集合模块,提供了许多有用的集合类。
namedtuple

我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:

>>> p = (1, 2)

但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。

定义一个class又小题大做了,这时,namedtuple就派上了用场:

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2

namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。

这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。

可以验证创建的Point对象是tuple的一种子类:

>>> isinstance(p, Point)
True
>>> isinstance(p, tuple)
True

类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:

# namedtuple('名称', [属性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])

deque

使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])

deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
defaultdict

使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默认值
'N/A'

注意默认值是调用函数返回的,而函数在创建defaultdict对象时传入。

除了在Key不存在时返回默认值,defaultdict的其他行为跟dict是完全一样的。
OrderedDict

使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

如果要保持Key的顺序,可以用OrderedDict:

>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict的Key是无序的
{'a': 1, 'c': 3, 'b': 2}
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

>>> od = OrderedDict()
>>> od['z'] = 1
>>> od['y'] = 2
>>> od['x'] = 3
>>> od.keys() # 按照插入的Key的顺序返回
['z', 'y', 'x']

OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:

from collections import OrderedDict

class LastUpdatedOrderedDict(OrderedDict):

  def __init__(self, capacity):
    super(LastUpdatedOrderedDict, self).__init__()
    self._capacity = capacity

  def __setitem__(self, key, value):
    containsKey = 1 if key in self else 0
    if len(self) - containsKey >= self._capacity:
      last = self.popitem(last=False)
      print 'remove:', last
    if containsKey:
      del self[key]
      print 'set:', (key, value)
    else:
      print 'add:', (key, value)
    OrderedDict.__setitem__(self, key, value)

Counter

Counter是一个简单的计数器,例如,统计字符出现的个数:

>>> from collections import Counter
>>> c = Counter()
>>> for ch in 'programming':
...   c[ch] = c[ch] + 1
...
>>> c
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})

Counter实际上也是dict的一个子类,上面的结果可以看出,字符'g'、'm'、'r'各出现了两次,其他字符各出现了一次。
小结

collections模块提供了一些有用的集合类,可以根据需要选用。

Python 相关文章推荐
一个超级简单的python web程序
Sep 11 Python
Python中的descriptor描述器简明使用指南
Jun 02 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
python中is与双等于号“==”的区别示例详解
Nov 21 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
python获取本机所有IP地址的方法
Dec 26 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
python生成并处理uuid的实现方式
Mar 03 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
进一步探究Python中的正则表达式
Apr 28 #Python
在Python程序中实现分布式进程的教程
Apr 28 #Python
浅析Python多线程下的变量问题
Apr 28 #Python
python实现向ppt文件里插入新幻灯片页面的方法
Apr 28 #Python
Python实现对PPT文件进行截图操作的方法
Apr 28 #Python
在Python下尝试多线程编程
Apr 28 #Python
Python输出PowerPoint(ppt)文件中全部文字信息的方法
Apr 28 #Python
You might like
php strtotime 函数UNIX时间戳
2009/01/14 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
jquery easyui使用心得
2014/07/07 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
python打造爬虫代理池过程解析
2019/08/15 Python
Python2与Python3关于字符串编码处理的差别总结
2020/09/07 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
Django自带的用户验证系统实现
2020/12/18 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
自荐信写法介绍
2014/01/25 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
校长新学期致辞
2015/07/30 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python