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