使用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 Mysql自动备份脚本
Jul 14 Python
在Heroku云平台上部署Python的Django框架的教程
Apr 20 Python
详解Python使用tensorflow入门指南
Feb 09 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
python中的字符串内部换行方法
Jul 19 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
Jan 18 Python
python3利用Axes3D库画3D模型图
Mar 25 Python
Python如何实现的二分查找算法
May 27 Python
golang/python实现归并排序实例代码
Aug 30 Python
Python基础之常用库常用方法整理
Apr 30 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
获得Google PR值的PHP代码
2007/01/28 PHP
可以在线执行PHP代码包装修正版
2008/03/15 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
PHP HTTP 认证实例详解
2016/11/03 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
php实现小程序支付完整版
2018/10/09 PHP
JavaScript 学习历程和心得分享
2010/12/12 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
Node.js 条形码识别程序构建思路详解
2016/02/14 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
JS中数据结构之栈
2019/01/01 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
python静态方法实例
2015/01/14 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
django+echart数据动态显示的例子
2019/08/12 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
特色冷饮店创业计划书
2014/01/28 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js