使用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发腾讯微博代码分享
Jan 10 Python
python统计文本字符串里单词出现频率的方法
May 26 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
Django 导出 Excel 代码的实例详解
Aug 11 Python
python实现redis三种cas事务操作
Dec 19 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
关于numpy数组轴的使用详解
Dec 05 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
Python如何使用ElementTree解析xml
Oct 12 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 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
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
AngularJS ng-controller 指令简单实例
2016/08/01 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
JS验证码实现代码
2017/09/14 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
Python中if __name__ == "__main__"详细解释
2014/10/21 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
python爬虫实现获取下一页代码
2020/03/13 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
任意存:BOXFUL
2018/05/21 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
常见的软件开发流程有哪些
2015/11/14 面试题
测绘工程本科生求职信
2013/10/10 职场文书
生物科学专业个人求职信范文
2013/12/05 职场文书
公司贷款承诺书
2014/05/30 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
先进党支部事迹材料
2014/12/24 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书