第30天:Python collections 模块

1.简介

collections 是 python 的内置模块,提供了很多方便且高性能的关于集合的操作,掌握这些知识有助于提高代码的性能和可读性。

2.常用功能

2.1 namedtuple 功能详解

namedtuple() 返回一个新的元组子类,且规定了元组的元素的个数,同时除了使用下标获取元素之外,还可以通过属性直接获取。

from collections import namedtupleUser = namedtuple("User",["name", "age", "weight"])user = User("admin", "20", "60")name, age, weight = userprint(user[0])print(name, age, weight)print(user.name, user.age, user.weight)
# 输出结果如下adminadmin 20 60admin 20 60

由以上代码可以看出,namedtuple() 相当于直接定义了一个新的类,但是这个类跟传统的定义 class 的方式又有着巨大的区别。该方式会比直接定义 class 的方式省很多空间,其次其返回值是一个 tuple,支持 tuple 的各种操场。

同时,namedtuple() 还自带两个非常好用的方法。

# 将序列直接转换为新的 tuple 对象user = ["root", 32, 65]user = User._make(user) print(user) # 输出 User(name='root', age=32, weight=65)
# 返回一个 dictuser = User("admin", 20, 60)print(user._asdict()) # 输出 OrderedDict([('name', 'admin'), ('age', 20), ('weight', 60)])

2.2 ChainMap 功能讲解

ChainMap() 可以将多个字典集合到一个字典中去,对外提供一个统一的视图。注意:该操作并是不将所有字典做了一次拷贝,实际上是在多个字典的上层又进行了一次封装而已。

from collections import ChainMap
user1 = {"name":"admin", "age":"20"}user2 = {"name":"root", "weight": 65}users = ChainMap(user1, user2)print(users.maps)
users.maps[0]["name"] = "tiger"print(users.maps)
for key, value in users.items(): print(key, value)
# 输出如下[{'name': 'admin', 'age': '20'}, {'name': 'root', 'weight': 65}][{'name': 'tiger', 'age': '20'}, {'name': 'root', 'weight': 65}]name tigerweight 65age 20

由此可见,如果 ChainMap() 中的多个字典有重复 key,查看的时候可以看到所有的 key,但遍历的时候却只会遍历 key 第一次出现的位置,其余的忽略。同时,我们可以通过返回的新的视图来更新原来的的字典数据。进一步验证了该操作不是做的拷贝,而是直接指向原字典。

2.3 deque 功能详解

dqueue 是 ”double-ended queue” 的简称,是一种类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)操作。大大加快了遍历速度


from collections import dequeq = deque([1, 2, 3])q.append('4')q.appendleft('0')print(q)print(q.popleft())
# 输出如下deque(['0', 1, 2, 3, '4'])0

2.4 Counter 功能详解

Counter 可以简单理解为一个计数器,可以统计每个元素出现的次数,同样 Counter() 是需要接受一个可迭代的对象的。

from collections import Counter
animals = ["cat", "dog", "cat", "bird", "horse", "tiger", "horse", "cat"]animals_counter = Counter(animals)print(animals_counter)print(animals_counter.most_common(2))
Counter({'cat': 3, 'horse': 2, 'dog': 1, 'bird': 1, 'tiger': 1})[('cat', 3), ('horse', 2)]
# 输出如下Counter({'cat': 3, 'horse': 2, 'dog': 1, 'bird': 1, 'tiger': 1})[('cat', 3), ('horse', 2)]

其实一个 Counter 就是一个字典,其额外提供的 most_common() 函数通常用于求 Top k 问题。

2.5 OrderedDict 功能详解

OrderedDict 是字典的子类,保证了元素的插入顺序。在 3.7 版本下,字典同样也保证了元素的插入顺序。那相比内置字典 OrderedDict 有哪些升级呢。

  • 算法上, OrderedDict 可以比 dict 更好地处理频繁的重新排序操作。在跟踪最近的访问这种场景(例如在 LRU cache)下非常适用。

  • OrderedDict 类有一个 move_to_end() 方法,可以有效地将元素移动到任一端。

from collections import OrderedDict
user = OrderedDict()user["name"] = "admin"user["age"] = 23user["weight"] = 65print(user)user.move_to_end("name") # 将元素移动至末尾print(user)user.move_to_end("name", last = False) # 将元素移动至开头print(user)
# 输出如下OrderedDict([('name', 'admin'), ('age', 23), ('weight', 65)])OrderedDict([('age', 23), ('weight', 65), ('name', 'admin')])OrderedDict([('name', 'admin'), ('age', 23), ('weight', 65)])

2.6 defaultdict 功能详解

defaultdict 是内置 dict 类的子类。它实现了当 key 不存在是返回默认值的功能,除此之外,与内置 dict 功能完全一样。

from collections import defaultdict
default_dict = defaultdict(int)default_dict["x"] = 10print(default_dict["x"])print(default_dict["y"])
# 输出如下100

注意,defaultdict 的参数必须是可操作的。比如 python 内置类型,或者无参的可调用的函数。

def getUserInfo(): return { "name" : "", "age" : 0 }
default_dict = defaultdict(getUserInfo)admin = default_dict["admin"]print(admin)
admin["age"] = 34print(admin)
# 输出如下{'name': '', 'age': 0}{'name': '', 'age': 34}

上述示例我们给 defaultdict 传了一个自定义函数,当字典中不存在所取 key 时返回默认的用户信息。

collections 总结

本文总结了 collections 提供的便利的操作,掌握这些知识将大大提高你的编程效率。

参考资料

[1] https://docs.python.org/zh-cn/3/library/collections.html

示例代码:Python-100-days-day030

系列文章
第29天:Python queue 模块详解

第28天:Python sys 模块详解

第27天:Python shutil 模块

第26天:Python os 模块详解

第25天:Python datetime 和 time

第24天:Python Standard Library 02

第23天:Python Standard Library 01

第22天:Python NameSpace & Scope

第21天:Web开发 Jinja2模板引擎

第0-20天:从 0 学习 Python 0-20 天合集

(0)

相关推荐

  • 原来 collections 这么好用!!

    (给Python开发者加星标,提升Python技能) 来源: 南枝向暖北枝寒MA https://blog.csdn.net/mall_lucy/article/details/108822795 [ ...

  • 用这10个小技巧加速Python编程

    重磅干货,第一时间送达 >>> # Positive Indexing... numbers = [1, 2, 3, 4, 5, 6, 7, 8]... print("Fi ...

  • python的常用内建模块与常用第三方模块

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 一.常用内置模块 1.datetime Python 提供了一个 time 和 calendar 模 ...

  • 【编程课堂】有序字典 OrderedDict

    编程课堂将和每周一坑一样,成为本教室公众号的一个长期固定栏目.每期讲解一个编程知识点,包括但不限于 Python 语法.模块介绍.编程小技巧等.用简短的篇幅,让你多了解一点编程. 上周每周一坑的题目 ...

  • 高手如何在Python中使用collections模块

    来源:AI入门学习 介   绍 Python 3有许多内置的数据结构,包括元组.字典和列表.数据结构为我们提供了一种组织和存储数据的方法.collections模块能够帮助我们高效地填充和操作数据结构 ...

  • 30个Python常用极简代码,拿走就能用

    作者丨Fatos Morina 来源丨Python 技术 导读 本文是 30 个极简任务,初学者可以尝试着自己实现:本文同样也是 30 段代码,Python 开发者也可以看看是不是有没想到的用法. 学 ...

  • 30行Python代码实现蚂蚁森林自动偷能量(附源码)

    虽然我支付宝加了好多好友,平时有很多能量可以偷,但由于太懒,至今一棵树都没种成,所以心心念念把偷能量这事自动化.之前通过用代码模拟手机点按的方式,实现了 朋友圈自动点赞,但当时蚂蚁森林的操作流程要比朋 ...

  • 精心整理了30个Python数据分析项目,拿走就用!

    今天给大家推荐一个优质的Python公众号「法纳斯特」,作者:小F. 学习编程是一个比较枯燥的过程,所以小F平常喜欢分享一些有趣.有料的Python原创项目实战.从2018年8月一直到现在,已经更新接 ...

  • 女友半夜加班发自拍,IT男友用30行python代码发现惊天秘密

    点击上方"机器学习爱好者社区" 选择"星标"公众号,重磅干货,第一时间送达 这是一个悲伤的故事 昨天,我司的python开发小哥刚准备下班陪女友共进晚餐,满心期 ...

  • python笔记46-史上最强大最好用的python日志模块nb_log

    前言 python的日志模块如何封装一值都是一个头疼的问题,封装的不好总是会出现重复打印等头疼问题. 现在终于找到一个最好用的日志模块nb_log,此日志模块由这位大佬开发的https://www.c ...

  • 30个Python常用极简代码,拿走就用

    学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则.本文是 30 个极简任务,初学者可以尝试着自己实现:本文同样也是 30 段代码,Python 开发者也可以看看是不是 ...

  • python random模块

    本篇介绍比较常用的一个标准模块,random. 这是一个随机数模块,可以用来随机生成随机数,经常被用于数学.游戏.算法等等上面. 1.导入random模块 要使用此模块,要先导入. import ra ...

  • python logging模块的几点总结

    http://www.voidcn.com/article/p-ctmbnbwp-bbo.html 关于使用python logging模块的几点总结 使用python的标准日志模块logging可以 ...