您现在的位置是:网站首页 > 博客日记 >

python内置库collections_容器类

作者:YXN-python 阅读量:74 发布日期:2025-01-31

Python 的 collections 模块提供了许多高效的数据结构,用于替代内置数据类型(如 dict, list, tuple 等)的扩展。这些数据结构在特定场景下性能更好或功能更强大。以下是 collections 库中常用类的详解:

1. deque(双端队列)

用途:高效地在队列的两端进行插入和删除操作(时间复杂度 O(1)),适合实现队列、栈等数据结构。

常用方法:

  • append(x):在右侧添加元素。
  • appendleft(x):在左侧添加元素。
  • pop():从右侧删除元素。
  • popleft():从左侧删除元素。
  • rotate(n):将队列向右循环移动 n 步(若 n 为负则向左)。
from collections import deque

dq = deque([1, 2, 3])
dq.append(4)  # 从右侧添加
dq.appendleft(0)  # 从左侧添加

print(dq)  # 输出:deque([0, 1, 2, 3, 4])

dq.pop()  # 从右侧删除
dq.popleft()  # 从左侧删除

print(dq)  # 输出:deque([1, 2, 3])

特点:

  • rotate(n):将队列旋转 n 步,正数向右旋转,负数向左旋转。
dq.rotate(1)  # 向右旋转
print(dq)  # 输出:deque([3, 1, 2])
dq.rotate(-1)  # 向左旋转
print(dq)  # 输出:deque([1, 2, 3])
  • maxlen:可以限制队列的最大长度,超出部分会自动从对端移除。
dq = deque([1, 2, 3], maxlen=3)
dq.append(4)
print(dq)  # 输出:deque([2, 3, 4], maxlen=3)

2. Counter(计数器)

用途:用于计数的容器,它是一个字典的子类,用于统计元素出现的次数。

常用方法:

  • elements():返回所有元素的迭代器。
  • most_common(n):返回频率最高的前 n 个元素。
  • 支持算术运算(如 +, -, &, |)。

示例:

from collections import Counter

words = ["apple", "banana", "apple", "orange"]
cnt = Counter(words)
print(cnt)  # Counter({'apple': 2, 'banana': 1, 'orange': 1})

# 合并计数器
cnt.update(["apple", "kiwi"])  # 更新计数
print(cnt.most_common(2))  # [('apple', 3), ('banana', 1)]

常用方法:

  • most_common(n):返回出现次数最多的 n 个元素及其计数。
print(counter.most_common(2))  # 输出:[(3, 3), (2, 2)]
  • elements():返回一个迭代器,包含所有元素(重复元素也会被展开)。
print(list(counter.elements()))  # 输出:[1, 2, 2, 3, 3, 3, 4]
  • update():更新计数器。
counter.update([1, 2, 2])
print(counter)  # 输出:Counter({2: 4, 3: 3, 1: 2, 4: 1})

6. ChainMap(链式映射)

用途:将多个字典合并为一个逻辑上的字典,查找时按顺序逐个字典搜索。

示例:

from collections import ChainMap

dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
chain = ChainMap(dict1, dict2)
print(chain["b"])  # 2(优先使用 dict1 中的值)
print(chain["c"])  # 4

7. UserDict, UserList, UserString

用途:创建自定义的字典、列表或字符串类,通过继承并重写方法实现定制化行为。

示例:

from collections import UserDict

class MyDict(UserDict):
    def __setitem__(self, key, value):
        super().__setitem__(key, value * 2)

d = MyDict()
d["x"] = 5  # 实际存储 {"x": 10}

 

YXN-python

2025-01-31