第30天:Python collections 模块

简介: 第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 天合集

目录
相关文章
|
3天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
12 5
|
13天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
17天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
58 5
|
20天前
|
Python
SciPy 教程 之 SciPy 模块列表 6
SciPy教程之常量模块介绍:涵盖公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率及力学单位。示例展示了角度单位转换为弧度的几个常用常量。
17 7
|
20天前
|
Python
SciPy 教程 之 SciPy 模块列表 7
`scipy.constants` 模块提供了常用的时间单位转换为秒数的功能。例如,`constants.hour` 返回 3600.0 秒,表示一小时的秒数。其他常用时间单位包括分钟、天、周、年和儒略年。
17 6
|
17天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
16 1
|
18天前
|
XML 前端开发 数据格式
超级详细的python中bs4模块详解
Beautiful Soup 是一个用于从网页中抓取数据的 Python 库,提供了简单易用的函数来处理导航、搜索和修改分析树。支持多种解析器,如 Python 标准库中的 HTML 解析器和更强大的 lxml 解析器。通过简单的代码即可实现复杂的数据抓取任务。本文介绍了 Beautiful Soup 的安装、基本使用、对象类型、文档树遍历和搜索方法,以及 CSS 选择器的使用。
48 1
|
19天前
|
Python
SciPy 教程 之 SciPy 模块列表 9
SciPy教程之常量模块介绍,涵盖多种单位类型,如公制、质量、角度、时间、长度、压强等。示例展示了如何使用`scipy.constants`模块查询不同压强单位对应的帕斯卡值,包括atm、bar、torr、mmHg和psi。
13 1
|
19天前
|
Python
SciPy 教程 之 SciPy 模块列表 8
SciPy教程之常量模块单位类型介绍。该模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例展示了部分长度单位的转换值,例如英寸、英尺、海里等。
14 1
|
21天前
|
知识图谱 Python
SciPy 教程 之 SciPy 模块列表 5
本教程介绍SciPy常量模块中的单位类型,涵盖公制、质量、时间、长度等单位。示例代码展示了如何使用`scipy.constants`模块获取不同质量单位的千克值,如公吨、磅、盎司、原子质量单位等。
14 1