### Python `collections` 模块常用方法总结
Python 的 `collections` 模块提供了许多用于处理数据结构的容器类,这些容器是对内置数据类型的扩展和增强。以下是该模块中常用的类及其方法的详细介绍。
#### 1. `namedtuple`
`namedtuple` 是一个工厂函数,用于创建具有命名字段的元组子类[^1]。
```python
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(10, 20)
print(p.x, p.y) # 输出: 10 20
```
#### 2. `deque`
`deque` 是一个双端队列,支持从两端高效地添加或删除元素[^3]。
- `append(x)`:在右侧添加元素。
- `appendleft(x)`:在左侧添加元素。
- `pop()`:移除并返回右侧元素。
- `popleft()`:移除并返回左侧元素。
- `count(x)`:计算指定元素的数量。
```python
from collections import deque
d = deque([1, 2, 3])
d.append(4)
d.appendleft(0)
print(d) # 输出: deque([0, 1, 2, 3, 4])
b = d.count(2)
print(b) # 输出: 1
```
#### 3. `Counter`
`Counter` 是一个字典子类,用于计数可哈希对象。它返回一个以元素为键、出现次数为值的字典[^2]。
- `elements()`:返回一个迭代器,包含所有元素(每个元素重复其计数次)。
- `most_common([n])`:返回前 n 个最常见的元素及其计数。
- `subtract(iterable)`:从计数中减去指定的元素。
```python
from collections import Counter
s = 'abcbcaccbbad'
s_counter = Counter(s)
print(s_counter.most_common(2)) # 输出: [('b', 4), ('c', 3)]
s_counter.subtract('ae')
print(s_counter) # 输出: Counter({'b': 4, 'c': 3, 'a': 1, 'd': 1, 'e': -1})
```
#### 4. `OrderedDict`
`OrderedDict` 是一个字典子类,保留了键值对的插入顺序[^4]。
```python
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od.keys()) # 输出: odict_keys(['a', 'b', 'c'])
```
#### 5. `defaultdict`
`defaultdict` 是一个字典子类,提供了一个默认值生成器,当访问不存在的键时会自动调用该生成器[^5]。
```python
from collections import defaultdict
def getUserInfo():
return {"name": "", "age": 0}
default_dict = defaultdict(getUserInfo)
admin = default_dict["admin"]
print(admin) # 输出: {'name': '', 'age': 0}
admin["age"] = 34
print(admin) # 输出: {'name': '', 'age': 34}
```
#### 6. `ChainMap`
`ChainMap` 将多个字典或其他映射组合成一个逻辑上的映射。查找时会在每个映射中依次查找[^4]。
```python
from collections import ChainMap
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
chain = ChainMap(dict1, dict2)
print(chain["b"]) # 输出: 2 (优先使用第一个映射中的值)
```
#### 7. `UserDict`, `UserList`, `UserString`
这些类是 `dict`, `list`, `str` 的包装器,允许用户自定义行为。
---
### 注意事项
- `namedtuple` 创建的对象是不可变的,类似于普通元组[^1]。
- `deque` 在需要频繁插入和删除操作时比列表更高效[^3]。
- `Counter` 的结果可以与其他 `Counter` 对象进行数学运算,如加法、减法等[^2]。
- `OrderedDict` 自 Python 3.7 起,普通字典也保证了插入顺序,但在某些场景下仍可能需要使用 `OrderedDict`[^4]。