Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain

6. Python 标准库

6.3 collections 模块

collections 模块是 Python 标准库中一个非常强大的模块,提供了许多有用的数据结构,这些数据结构是对 Python 内置数据类型(如列表、字典、集合等)的扩展和补充。collections 模块中的数据结构可以帮助开发者更高效地处理数据,尤其是在需要处理复杂数据结构时。

6.3.1 namedtuple

namedtuple 是 collections 模块中的一个工厂函数,用于创建具有命名字段的元组子类。与普通元组不同,namedtuple 允许通过字段名访问元素,而不仅仅是通过索引。这使得代码更具可读性和可维护性。

from collections import namedtuple

# 定义一个 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
6.3.2 deque

deque(双端队列)是 collections 模块中的一个类,它支持在队列的两端高效地添加和删除元素。与列表相比,deque 在两端操作的时间复杂度为 O(1),而列表在头部插入或删除元素的时间复杂度为 O(n)。

from collections import deque

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

# 在队列的右侧添加元素
d.append(4)  # deque([1, 2, 3, 4])

# 在队列的左侧添加元素
d.appendleft(0)  # deque([0, 1, 2, 3, 4])

# 从队列的右侧删除元素
d.pop()  # 返回 4, deque([0, 1, 2, 3])

# 从队列的左侧删除元素
d.popleft()  # 返回 0, deque([1, 2, 3])
6.3.3 Counter

Counter 是 collections 模块中的一个类,用于统计可哈希对象的出现次数。Counter 本质上是一个字典的子类,键是元素,值是元素的计数。

from collections import Counter

# 创建一个 Counter 对象
c = Counter(['apple', 'banana', 'apple', 'orange', 'banana', 'apple'])

# 统计元素出现的次数
print(c)  # 输出: Counter({'apple': 3, 'banana': 2, 'orange': 1})

# 获取某个元素的计数
print(c['apple'])  # 输出: 3

# 获取出现次数最多的元素
print(c.most_common(2))  # 输出: [('apple', 3), ('banana', 2)]
6.3.4 defaultdict

defaultdict 是 collections 模块中的一个类,它是字典的一个子类,允许为字典中的键提供一个默认值。当访问一个不存在的键时,defaultdict 会自动创建该键,并将其值初始化为默认值。

from collections import defaultdict

# 创建一个 defaultdict,默认值为 int 类型的 0
d = defaultdict(int)

# 访问不存在的键
d['apple'] += 1
d['banana'] += 2

print(d)  # 输出: defaultdict(<class 'int'>, {'apple': 1, 'banana': 2})
6.3.5 OrderedDict

OrderedDict 是 collections 模块中的一个类,它是一个有序字典,能够记住键值对的插入顺序。与普通字典不同,OrderedDict 在迭代时会按照插入顺序返回键值对。

from collections import OrderedDict

# 创建一个 OrderedDict 对象
od = OrderedDict()

od['apple'] = 1
od['banana'] = 2
od['orange'] = 3

# 按照插入顺序迭代
for key, value in od.items():
    print(key, value)
# 输出:
# apple 1
# banana 2
# orange 3
6.3.6 ChainMap

ChainMap 是 collections 模块中的一个类,用于将多个字典或映射组合在一起,形成一个单一的视图。ChainMap 不会合并这些字典,而是将它们链接在一起,形成一个逻辑上的单一映射。

from collections import ChainMap

# 创建两个字典
dict1 = {'apple': 1, 'banana': 2}
dict2 = {'orange': 3, 'apple': 4}

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

# 访问键
print(cm['apple'])  # 输出: 1 (从 dict1 中获取)
print(cm['orange'])  # 输出: 3 (从 dict2 中获取)
6.3.7 UserDict, UserList, UserString

collections 模块还提供了 UserDict, UserList, 和 UserString 类,这些类是为了方便用户创建自定义的字典、列表和字符串类。这些类可以作为基类,用户可以通过继承它们来实现自己的数据结构。

from collections import UserDict

# 创建一个自定义字典类
class MyDict(UserDict):
    def __setitem__(self, key, value):
        super().__setitem__(key, value * 2)

# 使用自定义字典类
my_dict = MyDict()
my_dict['apple'] = 1
print(my_dict)  # 输出: {'apple': 2}
6.3.8 总结

collections 模块提供了许多强大的数据结构,能够帮助开发者更高效地处理复杂的数据操作。无论是需要统计元素出现的次数、维护插入顺序的字典,还是需要高效的双端队列,collections 模块都能提供相应的解决方案。掌握这些数据结构的使用,可以显著提升代码的可读性和性能。

Last Updated:: 3/17/25, 7:20 PM