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入门篇之函数
Oct 20 Python
python脚本替换指定行实现步骤
Jul 11 Python
python正则表达式re之compile函数解析
Oct 25 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
May 08 Python
python爬取网页内容转换为PDF文件
Jul 28 Python
python2.x实现人民币转大写人民币
Jun 20 Python
在python中pandas的series合并方法
Nov 12 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
Apr 15 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
Python面向对象之成员相关知识总结
Jun 24 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 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
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
解析Javascript中中括号“[]”的多义性
2013/12/03 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
python字典DICT类型合并详解
2017/08/17 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
python中必要的名词解释
2019/11/20 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
土木工程毕业生自荐信
2013/11/12 职场文书
社区七一党员活动方案
2014/01/25 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
《大江保卫战》教学反思
2014/04/11 职场文书
新党章的学习心得体会
2014/11/07 职场文书
2015年检验科工作总结
2015/04/27 职场文书
小学运动会入场词
2015/07/18 职场文书
数据库连接池
2021/04/06 MySQL
MySQL数字类型自增的坑
2021/05/07 MySQL
yolov5返回坐标的方法实例
2022/03/17 Python