运维开发网

Python内置模块集合教程详细介绍

运维开发网 https://www.qedev.com 2022-05-17 17:36 出处:网络
collections是Python的一个内置模块,所谓内置模块的意思是指Python内部封装好的模块,无需安装即可直接使用。本文将详解介绍Collections的使用方式,需要的可以参考一下

collections是Python的一个内置模块,所谓内置模块的意思是指Python内部封装好的模块,无需安装即可直接使用。本文将详解介绍Collections的使用方式,需要的可以参考一下


1、模块说明

Collections是Python的内置模块。所谓内置模块,就是封装在Python内部的模块,不需要安装就可以直接使用。

collections 包含了一些特殊的容器,针对 Python 内置的容器,例如:list、dict、set、tuple,提供了另一种选择。namedtuple:可以创建包含名称的 tuple。deque:类似于 list 的容器,可以快速的在队列头部和尾部添加、删除元素。OrderedDict:dict的子类,可以记住元素的添加顺序。defaultdict:dict的子类,可以调用提供默认值的函数。Counter:dict的子类,计算可hash的对象。


2、 实战代码


(1) testNamedTuple函数

Python提供了很多非常容易使用的基本类型,比如不可变类型tuple,我们可以很容易地用它来表示一个二进制向量。

Namedtuple是一个用于创建自定义元组对象的函数。它还指定了元组元素的数量,并且可以通过属性而不是索引来引用元组的一个元素。

这样,我们就可以很容易地用namedtuple定义一个数据类型,它具有元组的不变性,可以根据属性引用,使用起来非常方便。

在这个例子中,我们用一个三维坐标x,y,z来定义一个有三个对象元素的tuple对象,然后通过坐标值来引用对应的值。

from collections import namedtuplefrom collections import dequefrom collections import defaultdictfrom collections import OrderedDictfrom collections import Counterdef testNamedTuple(): vector=namedtuple('vector',['x','y','z']) flag=vector(3,4,5) print(type(flag)) print(isinstance(flag,vector)) print(isinstance(flag,tuple)) #通过这里的判定我们就可以知晓它是元组类型 print(flag.x,flag.y,flag.z)


(2) testDeque函数

dequee是栈和队列的广义实现,dequee是quot双端队列quot;的缩写。

dequee支持在dequee两端插入和删除线程安全、内存高效的元素,性能类似于O(1)。虽然list也支持类似的操作,但主要是针对定长操作进行优化,从而在pop(0)和insert(0,v)上具有O(n)的时间复杂度(这将改变数据的位置和大小)。

在数据结构中,我们知道队列和堆栈是两种非常重要的数据类型,一种是FIFO,一种是LIFO。

在python中,使用list存储数据时,按索引访问元素的速度很快,但插入和删除元素的速度很慢。因为list是线性存储,在数据量很大的情况下,插入和删除的效率很低。

Deque是一种双向链表结构,用于高效的插入和删除,非常适合队列和堆栈等数据结构。

def testDeque(): list1=[x*x for x in range(101)] delist=deque(list1) #对列表进行了一次再处理,让list1列表变成了双向链表结构 delist.append(1000)#将x添加到deque的右侧 delist.appendleft(2000)#将x添加到deque的左侧 delist.pop(1000)#移除和返回deque中最右侧的元素,如果没有元素,将会报出IndexError; delist.popleft()#移除和返回deque中最左侧的元素,如果没有元素,将会报出IndexError; delist.count(1)#返回deque中元素等于1的个数 delist.remove(10000)#移除第一次出现的value,如果没有找到,报出ValueError; delist.reverse()#反转deque中的元素,并返回None; list2=[1,3,4,5] delist.extend(list2)#将可迭代变量iterable中的元素添加至deque的右侧 delist.extendleft(list2)#将变量iterable中的元素添加至deque的左侧,往左侧添加序列的顺序与可迭代变量iterable中的元素相反 delist.maxlen()#只读的属性,deque的最大长度,如果无解,就返回None delist.rotate(1)#从右侧反转n步,如果n为负数,则从左侧反转 delist.clear()#将deque中的元素全部删除,最后长度为0;


(3)testDefaultdict函数

Defaultdict是内置数据类型dict的子类。它的基本功能和dict一样,只是重写了一个method __missing__(key),增加了一个可写的对象变量default_factory。

使用dict字典类型时,如果引用的键不存在,就会抛出一个KeyError。如果想在键不存在时返回默认值,可以使用defaultdict。

def testDefaultdict(): dict1= defaultdict(lambda: 'default') #Key不存在时,返回一个默认值,就可以用default,defaultdict的其他行为跟dict是完全一样的 dict1["k1"]="v1" print(dict1["k2"]) list2= [('yellow',11),('blue',2),('yellow',3),('blue',4),('red',5),('red',10)] dict1 = defaultdict(list)#使用list作为default_factory,很容易将一个key-value的序列转换为一个关于list的词典 for k,v in list2: dict1[k].append(v) print(dict1)


(4) testOrderedDict函数

OrderedDict类似于普通的字典,只是它记住了元素插入的顺序。当在有序字典上迭代时,返回的元素是它们第一次被添加的顺序。这样,dict就是一个有序的字典。

使用dict时,键是乱序的。迭代dict时,我们无法确定键的顺序。但是如果想保持键的顺序,可以使用OrderedDict。

def testOrderedDict(): dict1=dict([('aaa', 111), ('ddd',444),('bbb', 222), ('ccc', 333)]) print(dict1) dict2 = OrderedDict([('ddd',444),('aaa', 111), ('bbb', 222), ('ccc', 333)])#OrderedDict的key会按照插入的顺序排列,不是key本身排序 print(dict2) dict3 = {"banana": 33, "apple": 222, "pear": 1, "orange": 4444} # dict sorted by key dict4=OrderedDict(sorted(dict3.items(), key=lambda t: t[0])) print("dict4",dict4) # dict sorted by value dict5=OrderedDict(sorted(dict3.items(), key=lambda t: t[1])) print("dict5",dict5) # dict sorted by length of key string dict6 = OrderedDict(sorted(dict3.items(), key=lambda t: len(t[0]))) print("dict6",dict6) print(dict6['apple'])


(5) testCounter函数def testCounter(): '''counter可以支持方便、快速的计数''' str1="abcdefgabcedergeghdjlkabcdefe" #将可迭代的字符串初始化counter str2=Counter(str1) print(str2) #从输出的内容来看,Counter实际上也是dict的一个子类 for k,v in str2.items(): print(k,v) dict3 = {"banana": 33, "apple": 222, "pear": 1, "orange": 4444,"apples":2}#将dict初始化counter dict4=Counter(dict3) print(dict4) print(dict4["test"])#Counter对象类似于字典,如果某个项缺失,会返回0,而不是报出KeyError; dict5=Counter(high=9,age=33,money=-1)#将args初始化counter print(dict5) #elements返回一个迭代器,每个元素重复的次数为它的数目,顺序是任意的顺序,如果一个元素的数目少于1,那么elements()就会忽略它; list1=list(dict5.elements()) print(list1) #most_common返回一个列表,包含counter中n个最大数目的元素 #,如果忽略n或者为None,most_common()将会返回counter中的所有元素,元素有着相同数目的将会以任意顺序排列; str1 = "abcdefgabcedergeghdjlkabcdefe" list1=Counter(str1).most_common(3) print(list1)if __name__ == '__main__': # testNamedTuple() # testCounter() testDefaultdict() # testDeque() # testOrderedDict()

关于Python内置模块集合的详细解释,本文到此为止。关于Python集合的更多信息

0

精彩评论

暂无评论...
验证码 换一张
取 消