使用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 相关文章推荐
简单介绍Python2.x版本中的cmp()方法的使用
May 20 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
Python3enumrate和range对比及示例详解
Jul 13 Python
Python使用百度api做人脸对比的方法
Aug 28 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
Pygame的程序开始示例代码
May 07 Python
Python字符串三种格式化输出
Sep 17 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
python turtle绘制多边形和跳跃和改变速度特效
Mar 16 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的session cookie错误
2009/08/09 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
php数组编码转换示例详解
2014/03/11 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
php使用parse_str实现查询字符串解析到变量中的方法
2017/02/17 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
js 原型对象和原型链理解
2017/02/09 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
微信小程序实现折叠展开效果
2018/07/19 Javascript
vue路由中前进后退的一些事儿
2019/05/18 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
python3实现ftp服务功能(客户端)
2017/03/24 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
python实现大文件分割与合并
2019/07/22 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
在Python中通过threshold创建mask方式
2020/02/19 Python
Python如何绘制日历图和热力图
2020/08/07 Python
python ssh 执行shell命令的示例
2020/09/29 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
报关专员求职信范文
2014/02/22 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
医德医风自我评价2015
2015/03/03 职场文书