使用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中元类用法实例
Oct 10 Python
python实现提取百度搜索结果的方法
May 19 Python
Python中pip安装非PyPI官网第三方库的方法
Jun 02 Python
学习python之编写简单乘法口诀表实现代码
Feb 27 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
May 16 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
python for循环输入一个矩阵的实例
Nov 14 Python
python-opencv颜色提取分割方法
Dec 08 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
Django+Celery实现动态配置定时任务的方法示例
May 26 Python
tensorflow中的数据类型dtype用法说明
May 26 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 字符串压缩方法比较示例
2014/01/23 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
jQuery 使用手册(六)
2009/09/23 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
浅谈Vue数据绑定的原理
2018/01/08 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
Python3实现定时任务的四种方式
2019/06/03 Python
基于Python函数和变量名解析
2019/07/19 Python
详解Python多线程下的list
2020/07/03 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
Python编写万花尺图案实例
2021/01/03 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
控制工程专业个人求职信
2013/09/25 职场文书
便利店的创业计划书
2014/01/15 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
事业单位考察材料范文
2014/12/25 职场文书
辩论赛主持人开场白
2015/05/29 职场文书