使用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  连接字符串(join %)
Sep 06 Python
Python实现检测服务器是否可以ping通的2种方法
Jan 01 Python
python使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
Mar 01 Python
彻底理解Python中的yield关键字
Apr 01 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
Pytorch 高效使用GPU的操作
Jun 27 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
Feb 22 Python
python 对xml解析的示例
Feb 27 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 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
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
PHP实现今天是星期几的几种写法
2013/09/26 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
BootStrap TreeView使用实例详解
2017/11/01 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
[03:08]Ti4观战指南上
2014/07/07 DOTA
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
python与字符编码问题
2019/05/24 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
上课看小说检讨书
2014/02/22 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
工作证明英文模板
2014/10/21 职场文书
公司搬迁通知
2015/04/20 职场文书
Django如何与Ajax交互
2021/04/29 Python
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技