天天看点

python 内置模块之 collections 的使用

python 有很多的内置模块,collections是比较常用的一个,collections实现了专门的容器数据类型,为python的内置容器提供了替代方案。(这句话是我根据官方文档理解翻译的。原文:This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple.)我理解为在python常用的数据类型基础上,提供了更高级的数据类型用法

collections中常用的类型有以下几种(除了我介绍的还有其他的用法,有兴趣的可以去官方文档看一下,地址:https://docs.python.org/3/library/collections.html):

(1) namedtuple(): 可以创建一个类对象

(2) deque: 双端队列,可以在两端操作

(3) counter: dict 的子类,具有统计功能

(4) OrderedDict: 有序字典

(5) defaultdict: dict的扩展子类,拥有dict的所有功能,还能在调用不存在的键时创建一个默认值

其中最常用的是namedtuple() 和 defaultdict

一、namedtuple

1. namedtuple 继承自tuple ,可以用来创建一个类对象

用法如下图:

python 内置模块之 collections 的使用

2. 为什么会用到这种方法来定义类,而不用常用的class 方法:

(1) 代码简洁

(2) 节省空间,少了用class 定义类的很多变量  (3) python解释器在解释class 类的时候会创建很多变量,使用namedtuple会省很多的中间变量,节省内存,提高效率,尤其是在数据分析的时候用处很大

3. namedtuple继承了tuple,所以也有拆包的功能,在创建类传参时可以使用,用法如下:

python 内置模块之 collections 的使用
python 内置模块之 collections 的使用

4. 除了从tuple继承的方法外,namedtuple还提供了3个方法和1个属性,为了避免冲突,使用下划线开头。

(1) _make(iterable): 创建新的实例方法,参数必须是可迭代的

python 内置模块之 collections 的使用

这里的user_tuple直接使用前面的

(2) _asdict(): 返回一个OrderdDict

python 内置模块之 collections 的使用

(3) _replace(**kwargs): 会返回一个新的namedtuple 实例,并将指定字段的值替换,也就是修改字段值,但是不会修改原实例,会返回一个新实例。

python 内置模块之 collections 的使用

(4) _fields: 返回所有字段,返回结果是tuple

python 内置模块之 collections 的使用

二、deque 双端队列

1. 用法跟list 类似,比list 多了左侧操作的方法

python 内置模块之 collections 的使用

2. 相关操作

(1) appendleft()

python 内置模块之 collections 的使用

(2) clear()

(3) conut()

(4) copy()

(5) extend()

extendleft()

python 内置模块之 collections 的使用

(6) index()

(7) pop()

popleft()

(8) remove()

(9) reverse()

python 内置模块之 collections 的使用

要注意,reversed是有返回值的,并不改变原值

(10) rotate():将元素向左或右移动,参数为1右移,-1 左移,默认为1

python 内置模块之 collections 的使用

(11) maxlen: deque的最大尺寸,如果返回None,表示没有限制

这些用法跟list是一样的,我就不演示了。

三、defaultdict

没用defaultdict之前,如果我们要统计一个列表中每个元素出现的次数,会怎么做呢?

一般我们都会想到下面这种方法:

python 内置模块之 collections 的使用

如果对字典的用法了解的更深入的话,会想到下面这种方法:

python 内置模块之 collections 的使用

这种方法相比第一种而言,不仅代码行数少,而且速度更快,更高效

在我们了解了defaultdict 之后,有一种更简单高效的用法:

python 内置模块之 collections 的使用
python 内置模块之 collections 的使用

这里参数还可以参数函数,用法如下:

python 内置模块之 collections 的使用

四、OrderedDict

python2 下,dict 无序的

OrderdDcit 有序

python3 下,都有序

这里的有序指的是添加顺序

用法有以下几种:

(1) 删除,popitem() 移除并返回一个键值对(key, value),参数为last, 不传参时删除最后一个,传参 last = True删除第一个, last = False,删除最后一个,默认为False

python 内置模块之 collections 的使用

(2) move_to_end(key, last=True)

last 为 True 时,元素移到末尾,为 False 时,移到首位,默认为True

当 key 不存在时,会报 KeyError错误

python 内置模块之 collections 的使用

五、Counter

Counter 是dict的子类,用于计数可哈希对象

可以理解为就是一个计数功能。

用法如下:

(1)

python 内置模块之 collections 的使用

(2) 如果元素不存在,不会报KeyError的错误,会返回一个0值

python 内置模块之 collections 的使用

(3) 如果你想把Counter中的对象移除,要用del 实现

如下,但是b中元素并不会受到影响

python 内置模块之 collections 的使用

(4) elements

在元素上返回一个迭代器,重复次数跟计数相同,如果计数小于等于0会忽略,按任意顺序返回

python 内置模块之 collections 的使用

(5) most_common([n])

返回数量最多的前n个元素的列表,如果没有传入n,会默认返回所有元素

python 内置模块之 collections 的使用

(6) substract

从一个Counter中减去另一个Counter

python 内置模块之 collections 的使用

Counter和defaultdict都有统计计数的功能,但时两者有什么区别,我还没有了解透彻,有明白的大佬,欢迎补充。

以上笔记是我根据官方文档和慕课网的一个视频教程整理出来的,如果有兴趣的也可以自己去慕课网上看一下。

因为只是学习了一下collections模块,并没有在实际工作中使用,如果有错误的地方,还请指正,共同进步,谢谢!

继续阅读