python 容器数据类型 collections

collections 说明

collections 模块提供了一系列的扩展数据结构,它补充了 Python 标准内置容器,如 dict、list、set 和 tuple。collections 模块旨在提供更高效、更方便的数据结构解决方案。

collections 常用类

namedtuple:创建有命名字段的元组,使数据结构更清晰易读。
OrderedDict:有序字典,维护插入顺序,适用于需要顺序关键字的数据存储。在Python 3.7+中普通的 dict 也有这个特性。
defaultdict:字典的子类,提供一个默认值,从而避免 KeyError。
Counter:用于统计可哈希对象中元素的出现次数。
deque:双向队列,支持从两端高效地增加和删除元素。适合用作队列和栈。
ChainMap: 用于将多个字典或映射组合成一个单一的视图,常用于模拟作用域链或进行参数搜索。
UserDict: 是一个像字典一样工作的封装类。它更易于扩展,比直接从 dict 继承更安全。
UserList: 封装了列表对象,使其更易于扩展和修改。
UserString: 封装了字符串对象,提供了修改字符串行为的简便方法。

Counter

描述:用于计数可哈希对象(如元素)出现的次数。它可以接受可迭代对象或映射(字典)作为输入,并创建一个计数器对象,其中包含每个元素的计数信息。
用法:collections.Counter([iterable-or-mapping])
        iterable-or-mapping:可选参数,可以是可迭代对象或映射(字典)。如果是可迭代对象,将统计每个元素的出现次数;如果是映射(字典),则创建一个 Counter 对象,包含映射中键的计数信息。
适用场景:
    快速统计:Counter 类提供了快速统计可哈希对象中各元素出现次数的功能,适用于需要对元素计数的场景。
    类似字典:Counter 对象类似于字典(dict),但不同之处在于它会自动将元素映射到它们的出现次数。
    方便统计:通过 most_common() 方法,可以方便地获取出现次数最多的元素及其计数。
主要方法:
    elements():返回一个迭代器,包含 Counter 中的所有元素,重复出现的次数与它们的计数一样。
    most_common(n):返回计数器中出现次数最多的前 n 个元素和它们的计数,以列表形式返回。
    运算符 + 和 -:允许 Counter 对象之间进行加法和减法操作,例如计数器相加就会合并计数。
    update():将另一个可迭代对象或映射中的元素添加到当前计数器中。
from collections import Counter

# 创建一个计数器对象
c = Counter(['a', 'b', 'a', 'c', 'b', 'a'])

# 输出计数器
print("计数器:", c)              # 输出: Counter({'a': 3, 'b': 2, 'c': 1})

# 获取计数器中的元素及重复出现的次数
print("所有元素:", list(c.elements()))   # 输出: 所有元素: ['a', 'a', 'a', 'b', 'b', 'c']

# 获取出现次数最多的元素
print("出现次数最多的元素:", c.most_common(2))  # 输出: 出现次数最多的元素: [('a', 3), ('b', 2)]

# 更新计数器
c.update(['a', 'b', 'c', 'd'])
print("更新后的计数器:", c)      # 输出: 更新后的计数器: Counter({'a': 4, 'b': 3, 'c': 2, 'd': 1})

deque

描述:用于实现双端队列(deque,即 double-ended queue)。双端队列是一种具有队列和栈的特性的数据结构,在两端都可以进行元素的插入和删除操作。它适合用于实现队列和广度优先树搜索。
用法:collections.deque([iterable[, maxlen]])
        iterable:可选参数,如果提供了可迭代对象作为参数,初始化双端队列,将迭代对象的元素添加到双端队列中。
        maxlen:可选参数,用于限制双端队列的最大长度。如果提供了这个参数,当双端队列的长度达到 maxlen 时,再向队列中添加元素将会导致队列另一端元素被弹出。
常用操作:
    append(x):在队尾添加元素 x。
    appendleft(x):在队头添加元素 x。
    pop():移除并返回队尾元素。
    popleft():移除并返回队头元素。
    clear():移除所有元素。
    extend(iterable):在队尾扩展双端队列,将可迭代对象的元素添加到队尾。
    extendleft(iterable):在队头扩展双端队列,将可迭代对象的元素添加到队头。
        
from collections import deque

# 初始化一个双端队列
d = deque([1, 2, 3, 4, 5], maxlen=5)

# 输出初始队列
print("初始队列:", d)     # 输出:初始队列: deque([1, 2, 3, 4, 5], maxlen=5)

# 在队尾添加元素
d.append(6)
print("在队尾添加元素:", d)  # 输出:在队尾添加元素: deque([2, 3, 4, 5, 6], maxlen=5)

# 在队头添加元素
d.appendleft(0)
print("在队头添加元素:", d)   # 输出:在队头添加元素: deque([0, 2, 3, 4, 5], maxlen=5)

# 移除队尾元素
removed_element = d.pop()
print(f"移除队尾元素: {removed_element}, 剩余队列: {d}")   # 输出:移除队尾元素: 5, 剩余队列: deque([0, 2, 3, 4], maxlen=5)

# 清空队列
d.clear()
print("清空队列:", d)   # 输出:清空队列: deque([], maxlen=5)

ChainMap

描述:用于将多个字典或映射对象链接在一起,从而形成一个单独的映射。这个类提供了一种非常方便的方法来在多个字典之间进行快速切换和查找。
用法:collections.ChainMap(*maps)
        *maps:一个或多个映射对象,如字典。可以传入多个映射对象,它们将按顺序链接在一起形成一个链。
主要属性:
    maps:属性,返回 ChainMap 中所有映射对象的列表。
    new_child(m=None, **kwargs) 创建一个新的 ChainMap 对象,该对象包含原始 ChainMap 对象的映射,以及额外的映射或关键字参数。如果指定了 m,它会成为新的映射加在映射列表的前面;如果未指定,则会使用一个空字典;如果提供了关键字参数 kwargs,它们会更新所传入的映射或新的空字典。
    parents:属性,返回一个新的 ChainMap 对象,包含当前 ChainMap 中的所有映射对象,但将第一个映射对象排除在外。
from collections import ChainMap

# 创建两个字典
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

# 创建 ChainMap 对象
chain = ChainMap(dict1, dict2)

# 输出 ChainMap 对象
print("ChainMap:", chain)           # 输出: ChainMap: ChainMap({'a': 1, 'b': 2}, {'b': 3, 'c': 4})

# 获取所有映射对象
print("所有映射对象:", chain.maps)    # 输出: 所有映射对象: [{'a': 1, 'b': 2}, {'b': 3, 'c': 4}]

# 访问元素
print("Value of 'b':", chain['b'])   # 输出: Value of 'b': 2

# 添加新的字典
dict3 = {'c': 5, 'd': 6}
new_chain = chain.new_child(dict3)

# 输出新的 ChainMap
print("New ChainMap with additional dictionary:", new_chain)  # 输出: New ChainMap with additional dictionary: ChainMap({'c': 5, 'd': 6}, {'a': 1, 'b': 2}, {'b': 3, 'c': 4})

# 查找 key 'c' 会返回 dict3 中的值
print("Value of 'c' in new ChainMap:", new_chain['c'])   # 输出:  Value of 'c' in new ChainMap: 5

# 创建一个新的 ChainMap,不包含最后一个字典
reduced_chain = chain.parents
print("Reduced ChainMap without the last dictionary:", reduced_chain) # 输出: Reduced ChainMap without the last dictionary: ChainMap({'b': 3, 'c': 4})

参考文档

https://docs.python.org/zh-cn/3.12/library/collections.html#/module-collections

posted @ 2024-05-11 18:34  小吉猫  阅读(17)  评论(0编辑  收藏  举报