使用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 30 Python
Python使用bs4获取58同城城市分类的方法
Jul 08 Python
Python中eval带来的潜在风险代码分析
Dec 11 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
python画出三角形外接圆和内切圆的方法
Jan 25 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
python ddt数据驱动最简实例代码
Feb 22 Python
详解Python使用Plotly绘图工具,绘制甘特图
Apr 02 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
pycharm导入源码的具体步骤
Aug 04 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如何透过ODBC来存取数据库
2006/10/09 PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
解析link_mysql的php版
2013/06/30 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
Active控件问题小结(附解决办法)
2016/06/09 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
使用javascript做在线算法编程
2018/05/25 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
介绍Python中的文档测试模块
2015/04/28 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
微型企业创业投资计划书
2014/01/10 职场文书
教师档案管理制度
2014/01/23 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python