python的常用模块之collections模块详解


Posted in Python onDecember 06, 2018

认识模块 

什么是模块?

常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

但其实import加载的模块分为四个通用类别: 
 

1 使用python编写的代码(.py文件)
 

2 已被编译为共享库或DLL的C或C++扩展
 

3 包好一组模块的包
 

4 使用C编写并链接到python解释器的内置模块

为何要使用模块?

如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用,

常用模块 

1. collections模块

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

1.namedtuple: 生成可以使用名字来访问元素内容的tuple
 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典

我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:

p = (1, 2)

但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。

这时,namedtuple就派上了用场:

用法:namedtuple('名称', [属性list]):

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2

类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:

from collections import namedtuple
Cirle = namedtuple("Cirle",['x','y','z'])
c = Cirle(4,5,6)
print(c.x,c.y,c.z)
OutPut:
4 5 6

2. 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(),这样就可以非常高效地往头部添加或删除元素。

from collections import deque
dq = deque([1,2])
dq.append('a')  # 从后面放数据 [1,2,'a']
dq.appendleft('b') # 从前面放数据 ['b',1,2,'a']
dq.insert(2,3)  #['b',1,3,2,'a']
print(dq.pop())   # 从后面取数据
print(dq.pop())   # 从后面取数据
print(dq.popleft()) # 从前面取数据
print(dq)
Output:
a
2
b
deque([1, 3])

3. 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)])

#有序字典
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # OrderedDict的Key是有序的
print(od['a'])
for k in od:
  print(k)

OutPut:
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
1
a
b
c

注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序

4. 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'

5. Counter

Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。

c = Counter('abcdeabcdabcaba')
print c
输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})

创建

下面的代码说明了Counter类创建的四种方法:

Counter类的创建 :

>>> c = Counter() # 创建一个空的Counter类
>>> c = Counter('gallahad') # 从一个可iterable对象(list、tuple、dict、字符串等)创建
>>> c = Counter({'a': 4, 'b': 2}) # 从一个字典对象创建
>>> c = Counter(a=4, b=2) # 从一组键值对创建

计数值的访问与缺失的键

当所访问的键不存在时,返回0,而不是KeyError;否则返回它的计数。

计数值的访问

>>> c = Counter("abcdefgab")
>>> c["a"]
2
>>> c["c"]
1
>>> c["h"]
0

计数器的更新(update和subtract)

可以使用一个iterable对象或者另一个Counter对象来更新键值。

计数器的更新包括增加和减少两种。其中,增加使用update()方法:

计数器的更新(update)

>>> c = Counter('which')
>>> c.update('witch') # 使用另一个iterable对象更新
>>> c['h']
3
>>> d = Counter('watch')
>>> c.update(d) # 使用另一个Counter对象更新
>>> c['h']
4

减少则使用subtract()方法:

计数器的更新(subtract)

>>> c = Counter('which')
>>> c.subtract('witch') # 使用另一个iterable对象更新
>>> c['h']
1
>>> d = Counter('watch')
>>> c.subtract(d) # 使用另一个Counter对象更新
>>> c['a']
-1

键的修改和删除

当计数值为0时,并不意味着元素被删除,删除元素应当使用del。

>>> c = Counter("abcdcba")
>>> c
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
>>> c["b"] = 0
>>> c
Counter({'a': 2, 'c': 2, 'd': 1, 'b': 0})
>>> del c["a"]
>>> c
Counter({'c': 2, 'b': 2, 'd': 1})

elements()

返回一个迭代器。元素被重复了多少次,在该迭代器中就包含多少个该元素。元素排列无确定顺序,个数小于1的元素不被包含。

elements()方法

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']

most_common([n])

返回一个TopN列表。如果n没有被指定,则返回所有元素。当多个元素计数值相同时,排列是无确定顺序的。
most_common()方法

>>> c = Counter('abracadabra')
>>> c.most_common()
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
>>> c.most_common(3)
[('a', 5), ('r', 2), ('b', 2)]

浅拷贝copy

>>> c = Counter("abcdcba")
>>> c
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
>>> d = c.copy()
>>> d
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})

算术和集合操作

+、-、&、|操作也可以用于Counter。其中&和|操作分别返回两个Counter对象各元素的最小值和最大值。需要注意的是,得到的Counter对象将删除小于1的元素。

Counter对象的算术和集合操作

>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d # c[x] + d[x]
Counter({'a': 4, 'b': 3})
>>> c - d # subtract(只保留正数计数的元素)
Counter({'a': 2})
>>> c & d # 交集: min(c[x], d[x])
Counter({'a': 1, 'b': 1})
>>> c | d # 并集: max(c[x], d[x])
Counter({'a': 3, 'b': 2})

其他常用操作

下面是一些Counter类的常用操作,来源于Python官方文档

Counter类常用操作

sum(c.values()) # 所有计数的总数
c.clear() # 重置Counter对象,注意不是删除
list(c) # 将c中的键转为列表
set(c) # 将c中的键转为set
dict(c) # 将c中的键值对转为字典
c.items() # 转为(elem, cnt)格式的列表
Counter(dict(list_of_pairs)) # 从(elem, cnt)格式的列表转换为Counter类对象
c.most_common()[:-n:-1] # 取出计数最少的n个元素
c += Counter() # 移除0和负值

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用python写个下载teahour音频的小脚本
May 08 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
深入浅析python with语句简介
Apr 11 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
Python Lambda函数使用总结详解
Dec 11 Python
调整Jupyter notebook的启动目录操作
Apr 10 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
Python中的特殊方法以及应用详解
Sep 20 Python
python pip如何手动安装二进制包
Sep 30 Python
Python OpenCV快速入门教程
Apr 17 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 #Python
Python操作json的方法实例分析
Dec 06 #Python
Python多线程应用于自动化测试操作示例
Dec 06 #Python
Python实现多属性排序的方法
Dec 05 #Python
python通过ffmgep从视频中抽帧的方法
Dec 05 #Python
Python中xml和json格式相互转换操作示例
Dec 05 #Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 #Python
You might like
简单的页面缓冲技术
2006/10/09 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
CI映射(加载)数据到view层的方法
2016/03/28 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
php 可变函数使用小结
2018/06/12 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
深入理解Node.js的HTTP模块
2016/10/12 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
pandas的相关系数与协方差实例
2019/12/27 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
公司端午节活动方案
2014/02/04 职场文书
上班迟到检讨书
2015/05/06 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python