使用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基于有道实现英汉字典功能
Jul 25 Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 Python
Python学习小技巧总结
Jun 10 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
Python字典遍历操作实例小结
Mar 05 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
dpn网络的pytorch实现方式
Jan 14 Python
如何在Python对Excel进行读取
Jun 04 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
python 利用jieba.analyse进行 关键词提取
Dec 17 Python
python opencv肤色检测的实现示例
Dec 21 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
php ci框架验证码实例分析
2013/06/26 PHP
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
JavaScript移除数组元素减少长度的方法
2013/09/05 Javascript
jquery垂直公告滚动实现代码
2013/12/08 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
详解Vue 2.0封装axios笔记
2017/06/22 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
python使用百度翻译进行中翻英示例
2014/04/14 Python
python下载文件时显示下载进度的方法
2015/04/02 Python
python模块之paramiko实例代码
2018/01/31 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
小结Python的反射机制
2020/09/28 Python
酒店前厅员工辞职信
2014/01/08 职场文书
优秀干部获奖感言
2014/01/31 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
材料员岗位职责
2014/03/13 职场文书
家长会主持词开场白
2014/03/18 职场文书
先进事迹演讲稿
2014/09/01 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android