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 json模块使用实例
Apr 11 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
python join方法使用详解
Jul 30 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
Python configparser模块配置文件过程解析
Mar 03 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
Python OpenCV去除字母后面的杂线操作
Jul 05 Python
使用Python绘制台风轨迹图的示例代码
Sep 21 Python
PyQT5速成教程之Qt Designer介绍与入门
Nov 02 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
ASP知识讲座四
2006/10/09 PHP
php设计模式 State (状态模式)
2011/06/26 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
angular json对象push到数组中的方法
2018/02/27 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
JavaScript 绘制饼图的示例
2021/02/19 Javascript
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
Python魔法方法详解
2019/02/13 Python
python集合是否可变总结
2019/06/20 Python
python实现画出e指数函数的图像
2019/11/21 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
keras tensorflow 实现在python下多进程运行
2020/02/06 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
Django中FilePathField字段的用法
2020/05/21 Python
解决TensorFlow训练模型及保存数量限制的问题
2021/03/03 Python
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
什么是Rollback Segment
2013/04/22 面试题
运动会通讯稿400字
2014/01/28 职场文书
毕业论文致谢信
2015/05/14 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
高三化学教学反思
2016/02/22 职场文书
php中配置文件保存修改操作 如config.php文件的读取修改等操作
2021/05/12 PHP
AngularJS实现多级下拉框
2022/03/25 Javascript