Python 的 collections
库提供了一些有用的集合类,用于扩展 Python 内置集合类型(如 list
、dict
、set
等)的功能。下面为你详细介绍该库中每个主要类及其使用示例:
1. namedtuple
namedtuple
是一个工厂函数,用于创建具有命名字段的元组子类。它使得元组更具可读性,类似于简单的类。
from collections import namedtuple
# 定义一个名为 Point 的 namedtuple 类型
Point = namedtuple('Point', ['x', 'y'])
# 创建 Point 实例
p = Point(1, 2)
# 访问字段
print(p.x) # 输出: 1
print(p.y) # 输出: 2
2. deque
deque
是双端队列,支持从两端高效地添加和删除元素,时间复杂度为 。
from collections import deque
# 创建一个 deque 对象
d = deque([1, 2, 3])
# 从右端添加元素
d.append(4)
print(d) # 输出: deque([1, 2, 3, 4])
# 从左端添加元素
d.appendleft(0)
print(d) # 输出: deque([0, 1, 2, 3, 4])
# 从右端删除元素
d.pop()
print(d) # 输出: deque([0, 1, 2, 3])
# 从左端删除元素
d.popleft()
print(d) # 输出: deque([1, 2, 3])
3. Counter
Counter
是一个字典的子类,用于统计可哈希对象的出现次数。
from collections import Counter
# 创建一个 Counter 对象
c = Counter(['a', 'b', 'a', 'c', 'b', 'a'])
# 统计元素出现次数
print(c) # 输出: Counter({'a': 3, 'b': 2, 'c': 1})
# 获取指定元素的出现次数
print(c['a']) # 输出: 3
# 找出出现次数最多的元素
print(c.most_common(1)) # 输出: [('a', 3)]
update()
方法允许你更新现有的Counter
对象,甚至可以从一个可迭代对象或者另一个Counter
对象中获取数据。
c = Counter(['a', 'b', 'a', 'c', 'b', 'a'])
c.update(['b', 'c', 'd'])
print(c) # 输出: Counter({'a': 3, 'b': 3, 'c': 2, 'd': 1})
subtract()
方法用于从现有的Counter
中减去计数,它可以通过一个可迭代对象或另一个Counter
对象来指定需要减少的元素。
c = Counter(['a', 'b', 'a', 'c', 'b', 'a'])
c.subtract(['a', 'b', 'd'])
print(c) # 输出: Counter({'a': 2, 'b': 1, 'c': 1, 'd': -1})
elements()
方法返回一个 迭代器,它会返回一个元素按其计数重复的序列。这个方法可以帮助你恢复原来的元素顺序和频率。
c = Counter(['a', 'b', 'a', 'c', 'b', 'a'])
elements = list(c.elements())
print(elements) # 输出: ['a', 'a', 'a', 'b', 'b', 'c']
clear()
方法清空Counter
中的所有元素。
c = Counter(['a', 'b', 'a', 'c', 'b', 'a'])
c.clear()
print(c) # 输出: Counter()
- 你可以使用
+
和-
运算符对Counter
对象进行合并或差异操作。它们类似于集合的合并和差集操作。
c1 = Counter(['a', 'b', 'a', 'c'])
c2 = Counter(['a', 'b', 'b', 'd'])
# 合并两个 Counter 对象
c3 = c1 + c2
print(c3) # 输出: Counter({'a': 2, 'b': 3, 'c': 1, 'd': 1})
# 取两个 Counter 对象的差集
c4 = c1 - c2
print(c4) # 输出: Counter({'c': 1})
|
运算符用于取两个Counter
的 并集。&
运算符用于取两个Counter
的 交集。
c1 = Counter(['a', 'b', 'a', 'c'])
c2 = Counter(['a', 'b', 'b', 'd'])
# 并集
c3 = c1 | c2
print(c3) # 输出: Counter({'a': 2, 'b': 2, 'c': 1, 'd': 1})
# 交集
c4 = c1 & c2
print(c4) # 输出: Counter({'a': 1, 'b': 1})
4. OrderedDict
OrderedDict
是一个字典的子类,它会记住元素插入的顺序。
from collections import OrderedDict
# 创建一个 OrderedDict 对象
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
# 遍历 OrderedDict
for key, value in od.items():
print(key, value)
# 输出:
# a 1
# b 2
# c 3
5. defaultdict
defaultdict
是一个字典的子类,当访问不存在的键时,会返回一个默认值,而不是抛出 KeyError
异常。
from collections import defaultdict
# 创建一个 defaultdict 对象,默认值为 0
dd = defaultdict(int)
# 访问不存在的键
print(dd['a']) # 输出: 0
# 向字典中添加元素
dd['b'] = 2
print(dd) # 输出: defaultdict(<class 'int'>, {'a': 0, 'b': 2})
6. ChainMap
ChainMap
用于将多个字典或映射组合成一个单一的视图,按顺序搜索键。
from collections import ChainMap
# 创建两个字典
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# 创建 ChainMap 对象
cm = ChainMap(dict1, dict2)
# 访问键
print(cm['a']) # 输出: 1
print(cm['b']) # 输出: 2,优先使用 dict1 中的值
print(cm['c']) # 输出: 4
评论区