Python中内建模块collections如何使用


Posted in Python onMay 27, 2020

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模块提供了一些有用的集合类,可以根据需要选用。

知识点补充:

在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

1.namedtuple: 生成可以使用名字来访问元素内容的tuple

2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

3.Counter: 计数器,主要用来计数

4.OrderedDict: 有序字典

5.defaultdict: 带有默认值的字典

以上就是Python中内建模块collections如何使用的详细内容,更多关于详解Python中的内建模块collections的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python检测远程服务器tcp端口的方法
Mar 14 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
详解Python中for循环是如何工作的
Jun 30 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
numpy使用技巧之数组过滤实例代码
Feb 03 Python
Django框架用户注销功能实现方法分析
May 28 Python
Python日志无延迟实时写入的示例
Jul 11 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 Python
Python 如何测试文件是否存在
Jul 31 Python
python爬虫之selenium库的安装及使用教程
May 23 Python
python绘制云雨图raincloud plot
Aug 05 Python
Python OpenCV实现测量图片物体宽度
May 27 #Python
Python中socket网络通信是干嘛的
May 27 #Python
Python中SQLite如何使用
May 27 #Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 #Python
Python中如何引入第三方模块
May 27 #Python
Python中的wordcloud库安装问题及解决方法
May 27 #Python
Python Dataframe常见索引方式详解
May 27 #Python
You might like
信用卡效验程序
2006/10/09 PHP
php数组总结篇(一)
2008/09/30 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
PHP微信网页授权的配置文件操作分析
2019/05/29 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
JavaScript 异步调用框架 (Part 1 - 问题 & 场景)
2009/08/03 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
layui复选框限制选择个数的方法
2019/09/18 Javascript
Python contextlib模块使用示例
2015/02/18 Python
python遍历数组的方法小结
2015/04/30 Python
Python递归遍历列表及输出的实现方法
2015/05/19 Python
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
Python检查ping终端的方法
2019/01/26 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
Python绘制热力图示例
2019/09/27 Python
Django和Flask框架优缺点对比
2019/10/24 Python
荷兰本土平价百货:HEMA
2017/10/23 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
酒店销售经理岗位职责
2014/01/31 职场文书
青年志愿者活动总结
2014/04/26 职场文书
放飞理想演讲稿
2014/09/09 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
2014学生会工作总结报告
2014/12/02 职场文书