使用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中的描述符(descriptor)
Jun 03 Python
Python运算符重载详解及实例代码
Mar 07 Python
Python字符串格式化的方法(两种)
Sep 19 Python
在Python中关于使用os模块遍历目录的实现方法
Jan 03 Python
Python小进度条显示代码
Mar 05 Python
pandas的to_datetime时间转换使用及学习心得
Aug 11 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
Nov 16 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
浅析Python面向对象编程
Jul 10 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
python excel多行合并的方法
Dec 09 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 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
JAVA/JSP学习系列之二
2006/10/09 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
jQuery实现简单滚动动画效果
2016/04/07 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
python爬取网站数据保存使用的方法
2013/11/20 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
python3.5仿微软计算器程序
2020/03/30 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
python 读入多行数据的实例
2018/04/19 Python
python 动态调用函数实例解析
2019/10/21 Python
Python: 传递列表副本方式
2019/12/19 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
用Python进行websocket接口测试
2020/10/16 Python
python实现计算器简易版
2020/12/17 Python
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
意大利网上药房:Farmacia 33
2020/01/27 全球购物
什么造成了Java里面的异常
2016/04/24 面试题
室内设计专业个人的自我评价
2013/12/18 职场文书
新员工入职感言
2014/02/01 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
销售辞职信范文
2015/03/02 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
个人廉政承诺书
2015/04/28 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
甲午大海战观后感
2015/06/02 职场文书
公司安全管理制度范本
2015/08/05 职场文书