使用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编程-将Python程序转化为可执行程序[整理]
Apr 09 Python
python使用any判断一个对象是否为空的方法
Nov 19 Python
python使用PyGame绘制图像并保存为图片文件的方法
Apr 24 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Python设计模式之备忘录模式原理与用法详解
Jan 15 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
浅谈pycharm使用及设置方法
Sep 09 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
基于python实现坦克大战游戏
Oct 27 Python
python在协程中增加任务实例操作
Feb 28 Python
基于tensorflow权重文件的解读
May 26 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 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 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
JS实现多功能计算器
2020/10/28 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
python实现对一个完整url进行分割的方法
2015/04/29 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
pytorch 数据集图片显示方法
2018/07/26 Python
python生成n个元素的全组合方法
2018/11/13 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
基于Python的OCR实现示例
2020/04/03 Python
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
使用索引有什么好处
2016/07/27 面试题
Linux如何命名文件--使用文件名时应注意
2014/05/29 面试题
产品推广策划方案
2014/05/10 职场文书
课外活动总结范文
2014/07/09 职场文书
司机岗位职责
2015/02/04 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
消防隐患整改通知书
2015/04/22 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
python办公自动化之excel的操作
2021/05/23 Python
使用Redis实现分布式锁的方法
2022/06/16 Redis