网易首页 > 网易号 > 正文 申请入驻

python collections 的超赞功能

0
分享至

Python中的collections库是一个非常实用的工具库,是对基础数据结构的补充。


1) collections.Counter 用于计数

假设我们给定了一个字符串列表,需要计算列表中每个字符串的出现次数。

使用字典是一种基本方法:


但你知道吗,我们还可以使用 collections.Counter 来实现这一功能。


使用 collections.Counter 有以下好处:

  • 无需处理字典逻辑

  • 生成的代码非常易读

  • 无需安装第三方库,因为 collections 是 Python 标准库的一部分

2) collections.OrderedDict

collections.OrderedDict 创建的字典可以保证键插入的顺序--在有序字典中,先插入的键会排在前面。



普通字典不也是这样吗? 差不多吧,但普通字典并不是为了保持这种顺序而建立的,因此可能无法保证其键的插入顺序。 ( 注: 从Python3.6开始,dict的插入顺序是保持的,同OrderedDict效果相同 )


3) collections.defaultdict

实际上,我经常在生产级 Python 代码中看到这种情况。

defaultdict 是一种特殊的字典,如果我们试图使用一个不存在的键,它会自动初始化一个默认的键值对。


注意到我们在defaultdict() 中输入了 int

  • defaultdict() 应该接收一个函数。

  • 该函数不带任何参数

  • 该函数返回的值就是 defaultdict 的默认值

  • defaultdict(int)中,默认值是 int(),也就是 0

  • 如果我们试图访问一个不存在的键,例如 dd[100],默认值就会自动创建,而不需要我们处理这个逻辑。

  • 如果我们试图访问一个已存在的键,它的行为就像一个普通的字典。

比方说,我们有一个域名列表,想按顶级域名(如“.com ”或“.net”)进行分组。我们先使用普通的字典。


注意,我们需要自己处理键值对的创建逻辑。

现在改用 defaultdict


注意,使用 defaultdict 后,如果某个键不存在,我们就不再需要手动创建键值对了。

  • defaultdict(list)中,默认值是 list(),即一个空列表

  • 如果我们试图访问一个不存在的键,就会自动创建一个空列表作为默认值

  • 此外,请注意代码更简短、更易读了

4) collections.namedtuple

在生产级 Python 代码中,我还看到很多命名的元组。

命名元组是一种特殊的元组:

  • 我们可以像访问普通元组一样访问值,例如: mytuple[0], mytuple[1]

  • 我们还可以像访问类一样访问值,例如 mytuple.name、 mytuple.age

在这里,我们创建了一个名为 Dog 的元组:

  • 注意,我们可以像访问普通元组一样访问它的值,例如: dog[0], dog[1], dog[2]

  • 我们还可以像访问对象一样访问它的值,例如 dog.name、dog.age、dog.breed

为什么我们在生产级 Python 代码中如此频繁地使用命名元组?

  • dog.namedog[0]更易读,也更一目了然。

  • 但对于较小的对象,我们不想为此创建整个类的开销

  • 因此,在这种情况下,命名元组可以在可读性和方便性之间取得平衡。

5) collections.deque

deque 是一个双端队列,从左右两端添加/删除项目都需要 O(1) 时间。

当我们在 Python 中实现队列时,没有经验的程序员可能会使用内置的 list。


注意,从列表左侧添加和删除需要 O(n) 时间,而不是 O(1) 时间。注意:O(1) 要比 O(n) 高效得多。

接下来,改用 deque。


现在,请注意所有 4 个操作都需要 O(1) 时间。

6) collections.abc

collections.abccollections 略有不同。

collections.abc 包含抽象基类,如 Sequence、Mapping、Hashable 等。我们可以使用这些抽象基类来检查某个类是否提供了特定功能。


注意 collectionscollections.abc 模块包含不同的内容。

7) collections.abc.Sequence

collections.abc.Sequence是序列(如列表、元组、命名元组等)的基础抽象类。我们可以使用 issubclass() 方法来验证这一点:


注意 - collections.abc.Sequencetyping.Sequence 完全相同 - 事实上,typing 模块从 collections.abc 模块导入了 Sequence


我们经常在类型提示中使用 collections.abc.Sequence,而不是 list/tuple/等。这是因为函数输入参数类型提示的目的是更通用:



  • 如果我们使用 list 而不是 Sequence 作为类型提示,用户在使用其他序列(如元组)时,可能会收到来自他们的线程或类型检查程序的投诉。

  • 如果我们使用Sequence而不是 list,用户就可以放心使用其他序列。

8) collections.abc.Mapping

collections.abc.Mapping是一个抽象基类,用于映射(即任何包含mapping的内容,如字典)。


注意 - typing.Mapping 只是从collections.abc.Mapping 导入


同样,在类型提示中,使用 Mapping 而不是 dict 或 DefaultDict 通常被认为是一种好的做法。


如果我们在类型提示中使用 Mapping 而不是 dict,该函数的用户就可以使用其他映射,如 defaultdict、mappingproxy 等,而不必担心林特或类型检查程序会抱怨。

9)collections.abc 中的其他抽象类

在生产级 Python 代码中,我可能用得最多的是 collections.abc.Sequencecollections.abc.Mapping,但我还是会时不时地看到这些抽象类。

Hashable 可用于检查值是否可以散列。注意:只有哈希值才能成为字典键,或添加到集合中。


Callable 可以用来检查对象是否可以像函数一样被调用。


Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。 本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。

购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。

Crossin的其他书籍:

添加微信 crossin123 ,加入编程教室共同学习 ~


感谢 转发点赞 的各位~

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
李宜雪的良知卖了2万元

李宜雪的良知卖了2万元

天下说法
2024-12-22 23:41:03
贾跃亭:FF再获3000万美元融资!明年1月首批原型车亮相,美国新能源车四万美元以下几乎没有具有竞争力产品

贾跃亭:FF再获3000万美元融资!明年1月首批原型车亮相,美国新能源车四万美元以下几乎没有具有竞争力产品

和讯网
2024-12-23 15:26:02
林诗栋启程回京!63岁恩师哭着送别,两人多次牵手拥抱

林诗栋启程回京!63岁恩师哭着送别,两人多次牵手拥抱

晓徙历史
2024-12-23 14:16:05
泽连斯基赢了,特朗普被搞定了,普京陷入危机

泽连斯基赢了,特朗普被搞定了,普京陷入危机

小佩棋不蹦迪
2024-12-22 19:54:51
原来人老了真的会害怕子女!网友分享:以前做过什么心里最清楚!

原来人老了真的会害怕子女!网友分享:以前做过什么心里最清楚!

有趣的火烈鸟
2024-12-23 10:12:12
曝特斯拉现车已基本售空 上海还有少量冲刺年末交付量

曝特斯拉现车已基本售空 上海还有少量冲刺年末交付量

手机中国
2024-12-23 14:00:04
女大学生当收纳师一单赚16万,整理了300平米衣帽间

女大学生当收纳师一单赚16万,整理了300平米衣帽间

大象新闻
2024-12-22 12:52:59
博主:五年多了,穆谢奎又要为大连的球队效力了

博主:五年多了,穆谢奎又要为大连的球队效力了

懂球帝
2024-12-23 19:24:12
64岁音乐家刘元去世,好友曝细节:夏天罹患重病,拒绝西医放化疗

64岁音乐家刘元去世,好友曝细节:夏天罹患重病,拒绝西医放化疗

古希腊掌管月桂的神
2024-12-22 16:30:47
留几手曝大雷,多年前就是gay并且是“受方”,舔脚趾照片流出

留几手曝大雷,多年前就是gay并且是“受方”,舔脚趾照片流出

南城无双
2024-12-20 23:30:21
40万美军已就位,白宫宣布对台军援,中方通告美国,台海出新变故

40万美军已就位,白宫宣布对台军援,中方通告美国,台海出新变故

逍遥史记
2024-12-23 14:56:25
45岁高圆圆穿上紧身针织衫,才发现,原来她的身材竟然如此之好

45岁高圆圆穿上紧身针织衫,才发现,原来她的身材竟然如此之好

南城无双
2024-12-01 00:26:09
网友:几年前南昌万象城人满为患,如今成当地最惨商业中心

网友:几年前南昌万象城人满为患,如今成当地最惨商业中心

映射生活的身影
2024-12-23 12:09:05
澳大利亚海滩,惊现“外星人的头皮”?

澳大利亚海滩,惊现“外星人的头皮”?

超人强动物俱乐部
2024-12-22 12:51:03
上海突然涌入大量韩国人!这些地方大排长龙,有的排队3小时,商家直呼:接待不完

上海突然涌入大量韩国人!这些地方大排长龙,有的排队3小时,商家直呼:接待不完

上观新闻
2024-12-22 20:51:00
张碧晨在直播的时候忘了开美颜,难怪华晨宇一直没下定决心娶她。

张碧晨在直播的时候忘了开美颜,难怪华晨宇一直没下定决心娶她。

人情皆文史
2024-12-22 03:12:23
过时了的衣服就是难看,别管当初买的有多贵。

过时了的衣服就是难看,别管当初买的有多贵。

人情皆文史
2024-12-23 09:01:10
袁记云饺也塌房了!离职员工爆猛料,现包现卖是假象 汤都是假的

袁记云饺也塌房了!离职员工爆猛料,现包现卖是假象 汤都是假的

美食阿鳕
2024-12-22 21:47:56
当家里的老人突然变得不讲理,说出很多难听的话,你要考虑他是不是患上了抑郁症

当家里的老人突然变得不讲理,说出很多难听的话,你要考虑他是不是患上了抑郁症

果壳
2024-12-23 16:27:00
成都有个小区房价暴跌。从3.8万直降到1.4万,这小区名字更是奇葩

成都有个小区房价暴跌。从3.8万直降到1.4万,这小区名字更是奇葩

人情皆文史
2024-12-23 11:46:45
2024-12-23 21:40:49
Crossin编程教室 incentive-icons
Crossin编程教室
简单有趣的python入门
430文章数 703关注度
往期回顾 全部

科技要闻

本田日产已磋商合并,预计明年6月结束谈判

头条要闻

中国黄金原董事长陈雄伟落马 家中搜出大量黄金珠宝

头条要闻

中国黄金原董事长陈雄伟落马 家中搜出大量黄金珠宝

体育要闻

年终进球盛宴!这法老冲着金球奖来的?

娱乐要闻

影版《射雕》最新预告!肖战版郭靖大获好评

财经要闻

中国保险中介巨头,爆雷了

汽车要闻

柴油才对味 大通星际X 2.5T舒适得不像皮卡

态度原创

时尚
本地
房产
家居
公开课

被嘲“网红脸”那么多年,她爆红的好意外

本地新闻

好吃潮州|潮州腐乳饼,咸甜党都沦陷了

房产要闻

中交、保利、招商压轴拿地!2024三亚疯狂卖地193亿!

家居要闻

现代简约 注重精神空间

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版