聊聊Python的一个内置模块Collections

聊聊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 是一个函数,它用来创建一个自定义的 tuple 对象,并且规定了 tuple 元素的个数,并可以用属性而不是索引来引用 tuple 的某个元素。

如此一来,我们用 namedtuple 可以很方便地定义一种数据类型,它具备 tuple 的不变性,又可以根据属性来引用,使用十分方便。

本示例中我们使用了一个三维坐标 x,y,z 来定义一个 tuple 对象,对象元素有3个,然后通过坐标值来引用相应的值即可。

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函数

deque是栈和队列的一种广义实现,deque是 “double-end queue” 的简称。

deque支持线程安全、有效内存地以近似O(1)的性能在 deque 的两端插入和删除元素,尽管 list 也支持相似的操作,但是它主要在固定长度操作上的优化,从而在 pop(0) 和 insert(0,v)(会改变数据的位置和大小)上有O(n)的时间复杂度。

在数据结构中,我们知道队列和堆栈是两个非常重要的数据类型,一个先进先出,一个后进先出。

在 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的最大长度,如果无解,就返回Nonedelist.rotate(1)#从右侧反转n步,如果n为负数,则从左侧反转delist.clear()#将deque中的元素全部删除,最后长度为0;

登录后复制

(3)testDefaultdict函数

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

使用 dict 字典类型时,如果引用的 key 不存在,就会抛出 KeyError。如果希望 Key 不存在时,返回一个默认值,就可以用 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 时,key 是无序的。在对 dict 做迭代时,我们无法确定 key 的顺序。但是如果想要保持 key 的顺序,可以用 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 keydict4=OrderedDict(sorted(dict3.items(), key=lambda t: t[0]))print("dict4",dict4)# dict sorted by valuedict5=OrderedDict(sorted(dict3.items(), key=lambda t: t[1]))print("dict5",dict5)# dict sorted by length of key stringdict6 = OrderedDict(sorted(dict3.items(), key=lambda t: len(t[0])))print("dict6",dict6)print(dict6['apple'])

登录后复制

(5) testCounter函数

def testCounter():'''counter可以支持方便、快速的计数'''str1="abcdefgabcedergeghdjlkabcdefe" #将可迭代的字符串初始化counterstr2=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初始化counterdict4=Counter(dict3)print(dict4)print(dict4["test"])#Counter对象类似于字典,如果某个项缺失,会返回0,而不是报出KeyError;dict5=Counter(high=9,age=33,money=-1)#将args初始化counterprint(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的一个内置模块Collections的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2242269.html

(0)
上一篇 2025年2月26日 20:52:37
下一篇 2025年2月18日 07:25:54

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 细思恐极,插上 U 盘就开始执行 Python 代码

    一个突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序。查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到。但是,如果我想,比如,当一个usb插入时,在后台自动把usb里的重要文…

    2025年2月26日 编程技术
    200
  • Python 文本终端 GUI 框架,太酷了

    Curses 首先出场的是 Curses[1]。 Curse Curses 是一个能提供基于文本终端窗口功能的动态库,它可以: 使用整个屏幕 创建和管理一个窗口 使用 8 种不同的彩色 为程序提供鼠标支持 使用键盘上的功能键 Curses …

    2025年2月26日 编程技术
    200
  • 浅谈Python当中Lambda函数的用法

    今天来给大家推荐一个Python当中超级好用的内置函数,那便是lambda方法,本篇教程大致和大家分享: 什么是lambda函数lambda函数过滤列表元素lambda函数和map()方法的联用lambda函数和apply()方法的联用什么…

    2025年2月26日
    200
  • 详细比对15款 Python 编辑器,请择优选用!

    写 Python 代码最好的方式莫过于使用集成开发环境(IDE)了。它们不仅能使你的工作更加简单、更具逻辑性,还能够提升编程体验和效率。 每个人都知道这一点。而问题在于,如何从众多选项中选择最好的 Python 开发环境。初级开发者往往面临…

    2025年2月26日 编程技术
    200
  • 使用Python构建电影推荐系统

    在日常数据挖掘工作中,除了会涉及到使用Python处理分类或预测任务,有时候还会涉及推荐系统相关任务。 推荐系统用于各个领域,常见的例子包括视频和音乐服务的播放列表生成器、在线商店的产品推荐器或社交媒体平台的内容推荐器。在这个项目中,我们创…

    2025年2月26日 编程技术
    200
  • 手把手使用 Python 删除 Windows 下的长路径文件

    0x01 文章背景 近期,笔者所在公司的某业务系统的存储临近极限,服务器马上就要跑不动了,由于该业务系统A包含多个子系统A1、A2、A3 … An,这些子系统的中间存储文件由于设计原因,都存储在同一个父级目录之内,唯一不同的是,…

    2025年2月26日
    200
  • 十个 Python 脚本来自动化你的日常任务

    在这个自动化时代,我们有很多重复无聊的工作要做。 想想这些你不再需要一次又一次地做的无聊的事情,让它自动化,让你的生活更轻松。 那么在本文中,我将向您介绍 10 个 Python 自动化脚本,以使你的工作更加自动化,生活更加轻松。 因此,没…

    2025年2月26日
    200
  • 四步打包一个新的 Python 模块

    当你安装一个应用程序时,你通常是在安装一个软件包,其中包含应用程序的可执行代码和重要文件,如文档、图标等。在 Linux上,软件一般被打包成 RPM 或 DEB 等格式,用户只要通过 ​​dnf​​​ 或者 ​​apt​​​ 等命令就可以进…

    2025年2月26日
    200
  • 我写的 Python 代码,同事都说好

    人生苦短,我用 Python。 程序员的追求就是不写代码,早日财务自由。不对,一不小心把实话说出来了,应该是将代码写得简洁,优雅。 Python 程序员的追求则是 Pythonic,正好在 Python 这门语言中,「隐藏」了特别多方法,可…

    编程技术 2025年2月26日
    200
  • 通过 web3.py 用 Python 存取 Ethereum

    想要通过 Python 存取 Ethereum,从 Ethereum 官方的 Github 中可以看到有两种模块可以达成:web3.py 和 pyethereum 。就我目前的理解来说,两者的差别在于 web3.py 主要是作为外部存取 E…

    2025年2月26日
    200

发表回复

登录后才能评论