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使用logging模块发送邮件代码示例
Jan 18 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
python 检查是否为中文字符串的方法
Dec 28 Python
python如何以表格形式打印输出的方法示例
Jun 21 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
Django 静态文件配置过程详解
Jul 23 Python
python3中的eval和exec的区别与联系
Oct 10 Python
Python3 中sorted() 函数的用法
Mar 24 Python
Pytorch转tflite方式
May 25 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
Python入门学习之类的相关知识总结
May 25 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
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
将Sublime Text 3 添加到右键中的简单方法
2017/12/12 Javascript
一个小时快速搭建微信小程序的方法步骤
2019/04/15 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
详解Vue的组件中data选项为什么必须是函数
2020/08/17 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
Python中如何获取类属性的列表
2016/12/26 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
如何理解python面向对象编程
2020/06/01 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
微观物理专业自荐信
2014/01/26 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
项目合作意向书范本
2014/04/01 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
医德医魂心得体会
2014/09/11 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang