25 Python的collections模块

概述

在上一节,我们介绍了Python的sqlite3模块,包括:sqlite3模块中一些常用的函数和类。在这一节,我们将介绍Python的collections模块。collections模块是Python中的内置模块,它实现了特殊的容器数据类型,提供了Python的通用内建容器的替代选择。

使用collections模块中的这些数据结构,可以帮助我们更有效地解决问题,并写出更简洁、更易于理解的代码。比如:如果我们需要一个字典,当尝试获取一个不存在的键时,返回一个默认值,而不是抛出一个异常,那么可以使用defaultdict。又比如:如果我们需要一个记住元素插入顺序的字典,那么可以使用OrderedDict。

下面,我们将逐一介绍collections模块中一些常用的函数和类。

collections.Counter类

collections.Counter类是一个字典子类,用于计数可哈希的对象。它返回一个字典,对应的键是输入值,值是输入值出现的次数。这是一个非常有用的工具,可以快速计数元素的数量。

python 复制代码
from collections import Counter

result = Counter('hello')
# 输出:Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})
print(result)

在上面的示例代码中,向Counter类的构造函数传入了字符串。返回的result为一个字典,包含了每个字符及其出现的次数。当然,Counter也可以接受列表、元组、集合或任何其他可迭代对象作为参数。

collections.deque类

collections.deque类是一个双端队列,允许从队列的两端进行添加和弹出操作。双端队列是一种具有两个端点的队列,可以在队列的两端添加和弹出元素。deque支持线程安全、内存高效地添加(append)和弹出(pop),从两端都可以操作,具有GIL锁的线程安全。

python 复制代码
from collections import deque

# 创建一个空的deque
d = deque()

# 在deque的右侧添加元素
d.append('h')
d.append('e')
d.append('l')
d.append('l')
d.append('o')

# 在deque的左侧添加元素
d.appendleft('C')
d.appendleft('S')
d.appendleft('D')
d.appendleft('N')

# 弹出deque右侧的元素
element = d.pop()
# 输出:'o'
print(element)

# 弹出deque左侧的元素
element = d.popleft()
# 输出:'N' 
print(element)

collections.defaultdict类

collections.defaultdict类是一个字典子类,用于创建一个类似于字典的数据结构。它覆盖了字典的getitem方法,以便当请求的键不存在时,可以返回一个默认值,而不是抛出KeyError异常。默认值是在创建defaultdict对象时通过参数指定的,如果默认值是一个工厂函数,则该函数将被调用以生成默认值。

python 复制代码
from collections import defaultdict

# 创建一个defaultdict,默认值为0
dd = defaultdict(int)

# 添加几个键值对
dd['C'] = 66
dd['S'] = 99

# 访问一个不存在的键,返回默认值0
print(dd['D'])

collections.namedtuple函数

collections.namedtuple函数用于创建一个可以使用名字来访问元素内容的tuple子类。namedtuple非常有用,特别是当我们需要创建一些具有多个字段的数据结构时。相比使用字典或列表,namedtuple更加轻量级,并且可以直接通过属性名访问元素,而不需要使用索引。这就避免了在代码中使用数字索引来访问元组或列表的元素,提高了代码的可读性和可维护性。

python 复制代码
from collections import namedtuple

# 创建一个namedtuple类,名为Point,具有xpos和ypos两个字段
Point = namedtuple('Point', ['xpos', 'ypos'])

# 创建一个Point对象
point = Point(66, 99)

# 访问对象的字段
# 输出:66
print(point.xpos)
# 输出:99
print(point.ypos)

collections.OrderedDict类

collections.OrderedDict类用于创建一个有序的字典对象。它继承自dict类,并添加了一些额外的功能,以保持字典中元素的插入顺序。OrderedDict与普通的dict类似,但它会记住元素被插入的顺序。当遍历OrderedDict时,元素将按照它们被插入的顺序返回。使用OrderedDict可以确保字典中的元素按照一定的顺序进行遍历,而不需要额外的排序操作。

python 复制代码
from collections import OrderedDict

# 创建OrderedDict对象
od = OrderedDict()

# 添加元素
od['C'] = 66
od['S'] = 77
od['D'] = 88
od['N'] = 99

# 遍历OrderedDict
for key, value in od.items():
    print(key, value)

collections.UserList类

collections.UserList类是list的子类,允许用户自定义列表的行为。UserList提供了与list相同的接口,但允许用户覆盖或添加方法以修改其行为。UserList非常有用,特别是当你需要定制列表的行为,或需要添加额外的功能时。你可以通过继承UserList类,并重写其方法来实现自定义的列表功能。

python 复制代码
from collections import UserList

class MyList(UserList):
    def __init__(self, list_init = None):
        super().__init__(list_init)

    def append(self, value):
        print(f"item {value} inserted")
        super().append(value)
  
# 创建一个MyList对象
my_list = MyList([66, 77, 88])

# 在列表中添加元素,输出:item 100 inserted  
my_list.append(100)
  
# 访问列表中的元素,输出:66
print(my_list[0])

使用UserList可以轻松地扩展列表的功能,并根据需要自定义其行为,这使得UserList成为处理特殊需求的列表操作的强大工具。除了自定义列表UserList,Python还内置了UserDict、UserSet、UserString,以允许用户定义他们自己的字典类、集合类和字符串类,这里就不再赘述了。

相关推荐
思则变1 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络2 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find3 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取4 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector6 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习6 小时前
Python入门Day2
开发语言·python
Vertira6 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉6 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗6 小时前
黑马python(二十四)
开发语言·python
晓13137 小时前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr