使用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 的 with 语句详解
Jun 13 Python
在Python中利用Pandas库处理大数据的简单介绍
Apr 07 Python
python中assert用法实例分析
Apr 30 Python
python实现的系统实用log类实例
Jun 30 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
Python实现生成随机日期字符串的方法示例
Dec 25 Python
深入浅析Python中的yield关键字
Jan 24 Python
利用Pandas 创建空的DataFrame方法
Apr 08 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
python定时按日期备份MySQL数据并压缩
Apr 19 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
完美处理python与anaconda环境变量的冲突问题
Apr 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
程序员编程十条戒律
2009/07/09 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
jquery获取transform里的值实现方法
2017/12/12 jQuery
JavaScript实现多重继承的方法分析
2018/01/09 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
小程序Request的另类用法详解
2019/08/09 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
webpack打包优化的几个方法总结
2020/02/10 Javascript
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
外贸业务员求职自荐信分享
2013/09/21 职场文书
建筑专业自我鉴定
2013/10/22 职场文书
市场营销专业推荐信
2013/11/03 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
个园导游词
2015/02/04 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
解决numpy和torch数据类型转化的问题
2021/05/23 Python
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
分享7个 Python 实战项目练习
2022/03/03 Python