collections——python不可错过的拓展数据类型模块!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42681866/article/details/82962425

前言

  说到python的数据类型(也称为容器),大家都耳熟能详:str\tuple\list\dict\set等,其中又分为可变类型和不可变类型,这些数据类型在项目中充当着重要的作用。但是除了这些,python还提供了一个强大的模块——collections,可以给我们更多的选择。

可命名元组——namedtuple

  首先来了解下元组的拓展类型——可命名元组,元组在我们的印象中通常称为不可变列表,也就是定义为当我们不希望一个容器里出现变动,这时会用到元组;但实际上,其另一方面的作用是用来记录信息,比如二维空间坐标(x,y),三维空间坐标(x,y,z)。
  但很明显,单纯地记录坐标,却没有一个“代号”,无法随意调用,所以可命名元组的存在就出现了意义。假如现在要定义一个二维坐标(x,y),就可以如下:

from collections import namedtuple
Origin = namedtuple(‘Origin’, ‘x y’)

  namedtuple接受两个参数,第一个是可命名元组的命名,第二个参数是元组里的各个字段,需要用可迭代对象容纳,这里使用的是字符串,各个字段间用空格隔开;同时也可以用列表、元组等,如用列表则上例可修改为Origin = namedtuple(‘Origin’, [‘x’,‘y’])。 最后再赋值给变量,一般变量名和namedtuple的命名是一致的。
  那可命名元组最大的作用就相当于一个简版的类,可以通过a1.x/a1.y访问到自己的属性:

a1 = Origin(0,0) (像传入参数样传入想传入的属性,这里给a1传入(0,0))
a1.x (访问x的值)
a1.y (访问y的值)

在这里插入图片描述
  此外可命名元组还提供其他的几个方法,_fields类属性和_make(iterable)类方法以及_asdict实例方法,以下是方法介绍:

Origin._fields (类属性:可以得到Origin这个可命名元组的所有字段)
a2 = Origin._make([3,4]) (类方法:传入一个可迭代对象,里面的参数充当新的实例属性)
a2._asdict() (实例方法:将实例转换成OrderedDict对象,后续介绍该对象)

在这里插入图片描述

“可排序字典”——OrderedDict

  字典因其快速查询的能力广受python爱好者的青睐(关于字典为何查询速度快,可查看该链接:字典为何查询速度快?)但字典相比列表有个明显的特征,就是其内字段是无序的,那有时我们希望是有序的(例如我们需要对字典进行迭代时,需要其按顺序出现),就可以用OrderedDict来创建。
  OrderedDict该类型的使用和dict是一样的,唯一的区别就是它会记录每个添加进来的键值对,并按先后顺序排列,并且还可以使用popitem(last=False)来删除并返回第一个添加的键值对。

from collections import OrderedDict
dict1 = OrderedDict([(‘m’,1),(‘n’,2)]) #和dict使用方法一致,这里创建OrderedDict
dict1.popitem(last=False) #删除并返回第一个键值对,该方法在字典里有大量数据时很实用,单纯的dict1.popitem()等同于pop()

在这里插入图片描述

“自动添加默认值字典”——defaultdict

  collections还提供了另外一个字典的变种——defaultdict,顾名思义:该类型的作用是在访问字典不存在的key时,不让其返回KeyError,而让其返回指定的值。
  举例说明如下:

from collections import defaultdict
dict2 = defaultdict(lambda: ‘N/A’) #创建dict2实例,当访问不存在的key时,返回N/A
dict2[‘m’]=1 #给dict2传入‘m’=1键值对

在这里插入图片描述
  defaultdict的使用方法和dict是一致的,它和OrderedDict都只不过是dict的变种,根本的使用方法是一致的。不过要注意的是,其默认值必须要是函数的返回值,一般用匿名函数lambda就足够了,如果单纯想返回[]、()、0就可以用python自带的数据类型:list\tuple\int
在这里插入图片描述
  简单探究底层原理:defaultdict之所以可以在找不到值时返回默认值,实际上是调用了__missing__魔法方法,字典在用[key]访问时,实际上是调用了__getitem__魔法方法,当该方法找不到时,python就会调用__missing__,而defaultdict里就封装了该方法。

计数器——Counter

  collections还有另一个类字典数据类型——Counter,一般称之为计数器,其作用就是计数,针对可迭代对象,统计其中每个元素的出现次数,并且可以用most_common(n)来统计出现次数的前几名,其中n表示你要查询前几名的数据,举例如下:

from collections import Counter
l = [1,2,3,4,5,4,3,2,3,1] #创建一个可迭代对象列表
cl.most_common(3) #返回出现次数排名前三的数

在这里插入图片描述

“双向列表”——deque

  说完collections里面拓展的元组和字典,当然不能少了最典型的列表,deque就是对列表的一个拓展,称之为“双向列表”。
  列表的强悍之处在于可以按索引访问元素,但是插入和删除元素就比较满了,因为其是线性存储,当数据量大的时候,删除前面的元素效率很低,因为本质上是数组。
  列表自身关于插入和删除携带两个方法append和pop,分别是针对末尾的插入和删除,而deque之所以称之为双向列表,最大的作用是还提供了开头的插入和删除,分别是appendleft和popleft。

from collections import deque
a = deque([1,2,3])
a.appendleft(0)
a.popleft()

在这里插入图片描述

总结

  关于collections模块最典型的五种拓展数据类型就介绍到这了,实际上该模块里还含有其他数据类型,待后续有空再一一介绍~

猜你喜欢

转载自blog.csdn.net/weixin_42681866/article/details/82962425