详解Python 中的容器 collections

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。这些容器可以帮助我们更加高效地完成各种任务。

后端开发标签