使用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正则表达式操作指南(re使用)
Sep 06 Python
python中实现定制类的特殊方法总结
Sep 28 Python
详解Python中的type()方法的使用
May 21 Python
Django imgareaselect手动剪切头像实现方法
May 26 Python
老生常谈Python基础之字符编码
Jun 14 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
Python实现图像的垂直投影示例
Jan 17 Python
Django Haystack 全文检索与关键词高亮的实现
Feb 17 Python
Jupyter notebook 远程配置及SSL加密教程
Apr 14 Python
python实现图片转换成素描和漫画格式
Aug 19 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 array_multisort()函数的使用札记
2011/07/03 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
基于JQuery的6个Tab选项卡插件
2010/09/03 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
2015/10/23 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
python根据距离和时长计算配速示例
2014/02/16 Python
python字符串替换的2种方法
2014/11/30 Python
Python获取某一天是星期几的方法示例
2017/01/17 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
先进工作者获奖感言
2014/02/08 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
自我评价优缺点范文
2015/03/11 职场文书
夫妻吵架保证书
2015/05/08 职场文书
合同纠纷调解书
2015/05/20 职场文书
举起手来观后感
2015/06/09 职场文书
Nginx搭建rtmp直播服务器实现代码
2021/03/31 Servers
php 解析非标准json、非规范json
2021/04/01 PHP
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang