当前位置: 首页 > 科技观察

说说Python内置模块Collections

时间:2023-03-19 01:44:11 科技观察

一、模块说明Collections是Python的内置模块。所谓内置模块是指Python内部封装好的模块,无需安装即可直接使用。collections包含一些特殊的容器,它们提供了Python内置容器的替代方案,例如list、dict、set和tuple。namedtuple:可以创建包含名称的元组。deque:类似于列表的容器,可以在队列的头部和尾部快速添加和删除元素。OrderedDict:dict的子类,它会记住添加元素的顺序。defaultdict:dict的子类,可以调用提供默认值的函数。Counter:dict的一个子类,用于计算可哈希对象。2.实战代码(1)testNamedTuple函数Python提供了很多非常有用的基本类型,比如不可变类型tuple,我们可以很方便的用它来表示一个二元向量。namedtuple是一个用于创建自定义元组对象的函数,指定元组元素的个数,可以使用属性代替索引来引用元组的元素。这样我们就可以很方便的用namedtuple定义一个数据类型,它具有元组的不变性,并且可以根据属性进行引用,使用起来非常方便。在这个例子中,我们使用一个三维坐标x,y,z来定义一个元组对象,它有3个元素,然后通过坐标值来引用对应的值。从集合导入namedtuple从集合导入dequefrom集合导入defaultdictfrom集合导入OrderedDictfrom集合导入CounterdeftestNamedTuple():vector=namedtuple('vector',['x','y','z'])flag=vector(3,4,5)print(type(flag))print(isinstance(flag,vector))print(isinstance(flag,tuple))#通过这里的判断可以知道是tuple类型print(flag.x,flag.y,flag.z)(2)testDeque函数deque是stack和queue的广义实现,deque是“双端队列”的缩写。Deque支持在deque的两端以大约O(1)的性能进行线程安全、内存高效的元素插入和删除。list虽然也支持类似的操作,但主要针对定长操作进行了优化,使得pop(0)和insert(0,v)(会改变数据的位置和大小)的时间复杂度为O(n).在数据结构中,我们知道队列和栈是两种非常重要的数据类型,一种是先进先出,一种是后进先出。在python中,使用列表存储数据时,通过索引访问元素非常快,但是插入和删除元素非常慢,因为列表是线性存储的,当数据量很大时,插入和删除效率是非常低。Deque是一种双向链表结构,用于高效实现插入和删除操作,非常适合实现队列、栈等数据结构。deftestDeque():list1=[x*xforxinrange(101)]delist=deque(list1)#list重新处理一次,使list1列表变成双向链表结构delist.append(1000)#在双端队列右侧添加xdelist.appendleft(2000)#在dequele左侧添加xdelist.pop(1000)#移除并返回双端队列中最右边的元素,如果没有元素会报错索引错误;delist.popleft()#取出并返回双端队列中最左边的元素,如果没有元素会报IndexError;delist.count(1)#返回dequest中等于1的元素个数delist.remove(10000)#移除第一次出现的值,如果没有找到,报ValueError;delist.reverse()#反转deque中的元素,返回None;list2=[1,3,4,5]退市。extend(list2)#将可迭代变量iterable中的元素添加到双端队列的右侧delist.extendleft(list2)#将变量iterable中的元素添加到双端队列的左侧,并将序列和可迭代变量添加到左边iterable中的元素对面delist.maxlen()#只读属性,deque的最大长度,无解则返回Nonedelist.rotate(1)#从右边倒转n步,如果n为负数,则从Leftreversedelist.clear()#删除deque中的所有元素,最终长度为0;(3)testDefaultdict函数defaultdict是内置数据类型dict的子类,基本功能和dict一样,只是重写了一个方法__missing__(key)和一个可写的对象变量default_factory。使用dict字典类型时,如果引用的key不存在,会抛出KeyError。如果想在Key不存在的时候返回一个默认值,可以使用defaultdict。deftestDefaultdict():dict1=defaultdict(lambda:'default')#当Key不存在时,返回一个默认值,这时就可以使用default了,defaultdict的其他行为与dictdict1["k1"]="v1"print(dict1["k2"])list2=[('黄色',11),('蓝色',2),('黄色',3),('蓝色',4),('red',5),('red',10)]dict1=defaultdict(list)#使用list作为default_factory,很容易将一个key-value序列转化成一个关于list的字典fork,vinlist2:dict1[k].append(v)print(dict1)(4)testOrderedDict函数OrderedDict类似于普通字典,只是它会记住插入元素的顺序,并且在遍历有序字典时,返回的元素是他们第一次被添加订单。因此dict是一个有序的字典。使用字典时,键是无序的。迭代字典时,我们无法确定键的顺序。但是如果你想保持键的顺序,你可以使用OrderedDict。deftestOrderedDict():dict1=dict([('aaa',111),('ddd',444),('bbb',222),('ccc',333)])打印(dict1)dict2=OrderedDict([('ddd',444),('aaa',111),('bbb',222),('ccc',333)])#OrderedDictkeys会按照插入顺序排列,不是keyitselfprint(dict2)dict3={"banana":33,"apple":222,"pear":1,"orange":4444}#字典按键排序dict4=OrderedDict(sorted(dict3.items(),key=lambdat:t[0]))print("dict4",dict4)#dict按值排序dict5=OrderedDict(sorted(dict3.items(),key=lambdat:t[1]))print("dict5",dict5)#dict按键字符串的长度排序dict6=OrderedDict(sorted(dict3.items(),key=lambdat:len(t[0])))print("dict6",dict6)print(dict6['apple'])(5)testCounterfunctiondeftestCounter():'''计数器可以支持方便快捷的计数'''str1="abcdefgabcedergeghdjlkabcdefe"#用可迭代字符串初始化计数器str2=Counter(str1)print(str2)#从输出的内容来看,Counter其实是dictfork,vinstr2.items()的子类:print(k,v)dict3={"香蕉":33,"apple":222,"pear":1,"orange":4444,"apples":2}#初始化dictcounterdict4=Counter(dict3)print(dict4)print(dict4["test"])#Counterobject类似对字典来说,如果缺少一项,它会返回0而不是报KeyError;dict5=Counter(high=9,age=33,money=-1)#initializeargscounterprint(dict5)#elementsreturnoneIterator,每个元素的重复次数就是它的个数,顺序任意顺序,如果一个元素的个数小于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()