Python 内置模块 collections 详解

简介: `collections` 是 Python 内置模块,提供多种高效数据类型,如 `namedtuple`、`deque`、`Counter` 等,帮助开发者优化数据处理流程,提升代码可读性与性能,适用于复杂数据结构管理与高效操作场景。

collections 是 Python 的一个强大内置模块,提供了多种高性能的数据类型,可以帮助开发者更高效地处理数据。本文将详细介绍 collections 模块中的各个主要组件,并附有相应的代码示例。

参考文章:Python 内置模块 collections | 简单一点学习 easyeasy.me

1. 引言

什么是 collections 模块

collections 是 Python 的一个内置模块,提供了多种用于存储数据的高级数据结构。这些数据结构扩展了 Python 内置类型的功能,使得在处理特定类型的数据时更加高效和方便。

为什么使用 collections

使用 collections 模块可以:

  • 提高代码的可读性和可维护性。
  • 提供更高效的数据操作方法。
  • 简化复杂的数据结构管理。

2. namedtuple

简介

namedtuple 是一个工厂函数,用于创建带有字段名称的元组子类。它结合了元组的不可变性和字典的键值访问特性。

创建和使用 namedtuple

from collections import namedtuple

# 定义一个名为 'Person' 的 namedtuple
Person = namedtuple('Person', ['name', 'age', 'gender'])

# 创建一个 Person 实例
person = Person(name='Alice', age=30, gender='Female')

# 访问字段
print(person.name)  # 输出: Alice
print(person.age)   # 输出: 30
print(person.gender)  # 输出: Female

namedtuple 的优点

  • 不可变性: 类似于元组,namedtuple 的实例是不可变的。
  • 可读性: 通过字段名称访问数据,提高了代码的可读性。
  • 内存效率: 比普通类更节省内存。

示例代码

from collections import namedtuple

# 定义一个名为 'Point' 的 namedtuple
Point = namedtuple('Point', ['x', 'y'])

# 创建 Point 实例
p = Point(10, 20)

# 访问字段
print(p.x, p.y)  # 输出: 10 20

# 解压
x, y = p
print(x, y)  # 输出: 10 20

3. deque

简介

deque(双端队列)是一个线程安全、内存高效的双向队列,支持在两端快速添加和删除元素。

deque 的基本操作

from collections import deque

# 创建一个 deque
d = deque([1, 2, 3])

# 在右侧添加元素
d.append(4)
print(d)  # 输出: deque([1, 2, 3, 4])

# 在左侧添加元素
d.appendleft(0)
print(d)  # 输出: deque([0, 1, 2, 3, 4])

# 移除右侧元素
d.pop()
print(d)  # 输出: deque([0, 1, 2, 3])

# 移除左侧元素
d.popleft()
print(d)  # 输出: deque([1, 2, 3])

deque 的优势

  • 高效: 在两端添加和删除元素的时间复杂度为 O(1)。
  • 线程安全: 可以安全地在多线程环境中使用。

示例代码

from collections import deque

# 创建一个 deque
d = deque([1, 2, 3], maxlen=5)

# 添加元素
d.extend([4, 5, 6])
print(d)  # 输出: deque([2, 3, 4, 5, 6], maxlen=5)

# 旋转
d.rotate(2)
print(d)  # 输出: deque([5, 6, 2, 3, 4], maxlen=5)

4. Counter

简介

Counter 是一个字典子类,用于计数可哈希对象。它可以方便地统计元素出现的次数。

Counter 的常用方法

  • elements(): 返回一个迭代器,重复元素其计数次数。
  • most_common([n]): 返回一个按元素计数降序排列的列表。
  • subtract([iterable-or-mapping]): 从另一个映射或可迭代对象中减去元素计数。

Counter 的应用场景

  • 统计字符出现频率。
  • 统计单词出现次数。
  • 统计列表中元素的出现次数。

示例代码

from collections import Counter

# 统计字符串中字符出现次数
c = Counter('abracadabra')

print(c)  # 输出: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})

# 获取出现次数最多的元素
print(c.most_common(3))  # 输出: [('a', 5), ('b', 2), ('r', 2)]

# 减去另一个 Counter
c.subtract({
   'a': 1, 'd': 1})
print(c)  # 输出: Counter({'a': 4, 'b': 2, 'r': 2, 'c': 1, 'd': 0})

5. OrderedDict

简介

OrderedDict 是一个字典子类,保留着插入元素的顺序。在 Python 3.7 及以上版本中,普通字典已经保留了插入顺序,但 OrderedDict 仍然有其独特的用途。

OrderedDict 的常用方法

  • move_to_end(key, last=True): 将指定键移动到字典的末尾或开头。
  • popitem(last=True): 移除并返回最后一个或第一个键值对。

OrderedDict 与普通字典的区别

  • OrderedDict 提供了额外的方法来操作元素的顺序。
  • 在旧版本的 Python 中,OrderedDict 是唯一保留插入顺序的字典类型。

示例代码

from collections import OrderedDict

# 创建一个 OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])

# 插入新的键值对
od['d'] = 4
print(od)  # 输出: OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])

# 移动键 'b' 到末尾
od.move_to_end('b')
print(od)  # 输出: OrderedDict([('a', 1), ('c', 3), ('d', 4), ('b', 2)])

# 移除最后一个键值对
od.popitem()
print(od)  # 输出: OrderedDict([('a', 1), ('c', 3), ('d', 4)])

6. defaultdict

简介

defaultdict 是一个字典子类,提供了一个默认值用于不存在的键。它可以简化代码,避免在访问不存在的键时抛出 KeyError

defaultdict 的使用场景

  • 统计元素出现次数。
  • 创建一个嵌套的字典结构。
  • 简化字典的初始化。

defaultdict 的常用方法

  • __missing__(key): 当访问不存在的键时调用,返回默认值。

示例代码

from collections import defaultdict

# 创建一个 defaultdict,默认值为列表
d = defaultdict(list)

# 添加元素
d['fruits'].append('apple')
d['fruits'].append('banana')
d['vegetables'].append('carrot')

print(d)  # 输出: defaultdict(<class 'list'>, {'fruits': ['apple', 'banana'], 'vegetables': ['carrot']})

# 访问不存在的键
print(d['grains'])  # 输出: []

7. ChainMap

简介

ChainMap 是一个字典的集合,提供了多个字典的视图。它可以模拟嵌套的作用域。

ChainMap 的常用方法

  • maps: 返回包含所有字典的列表。
  • new_child([m]): 返回一个新的 ChainMap,包含一个新的字典。
  • parents: 返回一个新的 ChainMap,不包含第一个字典。

ChainMap 的应用场景

  • 模拟嵌套字典。
  • 合并多个字典。
  • 动态地添加或移除字典。

示例代码

from collections import ChainMap

# 创建多个字典
dict1 = {
   'a': 1, 'b': 2}
dict2 = {
   'b': 3, 'c': 4}

# 创建一个 ChainMap
cm = ChainMap(dict1, dict2)

print(cm)  # 输出: ChainMap({'a': 1, 'b': 2}, {'b': 3, 'c': 4})

# 访问元素
print(cm['a'])  # 输出: 1
print(cm['b'])  # 输出: 2
print(cm['c'])  # 输出: 4

# 更新第一个字典
cm['b'] = 5
print(cm)  # 输出: ChainMap({'a': 1, 'b': 5}, {'b': 3, 'c': 4})

8. UserDict, UserList, UserString

简介

UserDict, UserList, UserString 是用于创建自定义字典、列表和字符串的基类。它们提供了对内置类型的封装,方便进行扩展和自定义。

使用场景

  • 创建自定义的数据结构。
  • 封装和扩展内置类型的功能。
  • 实现特定的数据处理逻辑。

示例代码

from collections import UserDict

# 创建一个自定义的字典类
class MyDict(UserDict):
    def __missing__(self, key):
        return f"Key '{key}' not found."

# 使用自定义的字典
md = MyDict({
   'a': 1, 'b': 2})

print(md['a'])  # 输出: 1
print(md['c'])  # 输出: Key 'c' not found.
目录
相关文章
|
7天前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
33 4
|
10月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
316 62
|
2月前
|
数据安全/隐私保护 Python
抖音私信脚本app,协议私信群发工具,抖音python私信模块
这个实现包含三个主要模块:抖音私信核心功能类、辅助工具类和主程序入口。核心功能包括登录
|
5月前
|
Python
Python教程:os 与 sys 模块详细用法
os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
232 14
|
9月前
|
Python
Python Internet 模块
Python Internet 模块。
208 74
|
6月前
|
人工智能 自然语言处理 Shell
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
本文介绍了如何在Python中导入模块及其作用,重点讲解了`__hello__`模块的导入与使用。通过`import`命令可以将外部模块引入当前环境,增强代码功能。例如,导入`__hello__`模块后可输出“Hello world!”。此外,还演示了如何使用`help()`和`dir()`函数查询模块信息,并展示了导入多个模块的方法。最后,通过一个实例,介绍了如何利用`jieba`、`WordCloud`和`matplotlib`模块生成词云图。总结来说,模块是封装好的功能部件,能够简化编程任务并提高效率。未来将探讨如何创建自定义模块。
83 8
|
6月前
|
缓存 Shell 开发工具
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 &quot;hello world!&quot; 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
100 5
|
10月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
263 63
|
10月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
217 61
|
10月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性

推荐镜像

更多