1. 介绍
Python 中内置的容器不仅包括了基本数据类型(如 int, float, str),还包括了许多常用的数据结构(如 list, tuple, set, dict 等)。但 Python 还提供了一个更高级的容器模块,即 collections,它提供了一些更特殊、更复杂的容器类型。
2. Counter
2.1 Counter 简介
Counter 是 Python 中的一个计数器容器,它可以帮助我们统计相同元素出现的次数。
from collections import Counter
c = Counter(['a', 'b', 'a', 'c', 'd', 'b', 'a'])
print(c)
# Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})
2.2 Counter 方法
Counter 还提供了一些方法,如:
elements(): 返回包含每个元素的迭代器。
c = Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})
print(list(c.elements()))
# ['a', 'a', 'a', 'b', 'b', 'c', 'd']
most_common([n]): 返回 n 个出现最多的元素及其出现次数。
c = Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})
print(c.most_common(2))
# [('a', 3), ('b', 2)]
3. deque
3.1 deque 简介
deque 是 Python 中的双端队列容器,就像是一个线性列表,但 deque 的两端都可以执行添加和删除操作。
from collections import deque
d = deque(['a', 'b', 'c'])
d.append('d')
print(d)
# deque(['a', 'b', 'c', 'd'])
d.appendleft('e')
print(d)
# deque(['e', 'a', 'b', 'c', 'd'])
3.2 deque 方法
deque 还提供了一些方法,如:
rotate(n=1): 将 deque 向右旋转 n 步(n 为正数),或向左旋转 n 步(n 为负数)。
d = deque([1, 2, 3, 4, 5])
d.rotate(2)
print(d)
# deque([4, 5, 1, 2, 3])
d.rotate(-2)
print(d)
# deque([1, 2, 3, 4, 5])
4. defaultdict
4.1 defaultdict 简介
在 Python 中访问不存在的字典键会引发 KeyError 异常。但是 defaultdict 会在访问不存在的键时返回默认值而不是抛出异常。
from collections import defaultdict
d = defaultdict(int)
d['a'] += 1
d['b'] += 1
d['c']
print(d)
# defaultdict(<class 'int'>, {'a': 1, 'b': 1, 'c': 0})
4.2 defaultdict 方法
defaultdict 还提供了一个方法:
default_factory: 属性值指定了 defaultdict 的默认值。
d = defaultdict(lambda: 'N/A')
d['a'] = 'Alice'
d['b'] = 'Bob'
print(d['c'])
# 'N/A'
5. namedtuple
5.1 namedtuple 简介
namedtuple 可以帮助我们为元组中的每个字段指定一个名称,使得元组的使用更加直观、可读。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p)
# Point(x=1, y=2)
5.2 namedtuple 方法
namedtuple 并未提供太多方法,但它自动生成的元组都是不可变的,所以可以使用元组的方法完成操作。
6. OrderedDict
6.1 OrderedDict 简介
OrderedDict 是 Python 中的字典容器,它通过维护插入元素的顺序,使得字典中的键值对是有序的。
from collections import OrderedDict
d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
print(d)
# OrderedDict([('a', 1), ('b', 2), ('c', 3)])
6.2 OrderedDict 方法
OrderedDict 并未提供太多方法,但与普通的字典不同的地方在于它会记住元素的插入顺序,所以其键值对是有序的。
7. ChainMap
7.1 ChainMap 简介
ChainMap 可以将多个字典组成一个字典,并且按照顺序进行查找。
from collections import ChainMap
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
chained_dict = ChainMap(dict1, dict2)
print(chained_dict['a'])
# 1
print(chained_dict['c'])
# 3
7.2 ChainMap 方法
ChainMap 并未提供太多方法,但除了通过索引访问元素外,它还提供了一个 maps 属性,用于获取所有字典组成的列表。
8. 总结
collections 模块提供了一些 Python 内置容器不能满足的高级容器,如 Counter、deque、defaultdict、namedtuple、OrderedDict 和 ChainMap。这些容器可以帮助我们更加高效地完成各种任务。