Python中collections模块的深度解析

Python collections 模块详解

collections 是 Python 标准库中提供高效数据结构的模块,扩展了内置数据类型(如 listdicttuple),适用于处理复杂数据场景。以下是其核心内容及常用函数:

核心数据结构与功能

1. namedtuple(命名元组)​
  • 用途:创建可通过属性名访问的元组,增强代码可读性。
  • 定义

    python

    from collections import namedtuple
    
    # 定义命名元组类型(类名,字段列表)
    Point = namedtuple("Point", ["x", "y"])
  •  

  • 使用示例

    python

    p = Point(10, y=20)
    print(p.x)       # 10
    print(p[0])      # 10(仍支持索引访问)
    print(p._asdict())  # {'x': 10, 'y': 20}(转为字典)
  • 2. deque(双端队列)​
  • 用途:高效实现队列(FIFO)或栈(LIFO),支持快速头尾插入/删除。

  • 核心方法

  • 方法 描述
    append(x) 右端添加元素
    appendleft(x) 左端添加元素
    pop() 移除并返回右端元素
    popleft() 移除并返回左端元素
    extend(iterable) 右端扩展多个元素
    extendleft(iterable) 左端扩展多个元素(逆序添加)
    rotate(n) 循环右移 n 步(负数为左移)
  • 示例

    python

    from collections import deque
    
    dq = deque([1, 2, 3])
    dq.appendleft(0)   # deque([0, 1, 2, 3])
    dq.rotate(1)       # deque([3, 0, 1, 2])
  •  

    3. Counter(计数器)​
  • 用途:统计可哈希对象(如字符串、列表)的元素频率。

  • 核心方法

  • 方法 描述
    elements() 返回元素迭代器(按计数重复)
    most_common(n) 返回频率最高的前 n 个元素
    update(iterable) 合并其他元素的计数

    示例

    python

    from collections import Counter
    
    cnt = Counter("abracadabra")
    print(cnt)                 # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
    print(cnt.most_common(2))  # [('a', 5), ('b', 2)]
    cnt.update(["a", "x"])     # 计数更新为 a:6, x:1

     

    4. defaultdict(默认字典)​
  • 用途:为字典提供默认值工厂,处理缺失键时自动生成默认值。
  • 定义

    python

    from collections import defaultdict
    
    # 指定默认值类型(如 int、list、lambda 表达式)
    d = defaultdict(int)       # 缺失键默认值为 0
  • 示例

    python

    words = ["apple", "banana", "apple"]
    count = defaultdict(int)
    for word in words:
        count[word] += 1  # 无需检查键是否存在
    print(count)          # {'apple': 2, 'banana': 1}
  •  

    5. OrderedDict(有序字典)​
  • 用途:保持键的插入顺序(Python 3.7+ 普通 dict 已支持,但此类提供额外方法)。

  • 特有方法

    方法 描述
    move_to_end(key) 将键移动到字典末尾或开头
    popitem(last=True) 移除最后/最先插入的键值对
  •  

    示例

    python

    from collections import OrderedDict
    
    od = OrderedDict()
    od["a"] = 1
    od["b"] = 2
    od.move_to_end("a")  # OrderedDict([('b', 2), ('a', 1)])

     

    6. ChainMap(链式映射)​
  • 用途:将多个字典合并为单一逻辑视图,按顺序查找键。

  • 核心方法

  • 方法 描述
    new_child(m) 添加新字典到链首
    parents 返回除第一个外的所有字典

    示例

    python

    from collections import ChainMap
    
    dict1 = {"a": 1, "b": 2}
    dict2 = {"b": 3, "c": 4}
    cm = ChainMap(dict1, dict2)
    print(cm["b"])  # 2(优先查找 dict1)
    print(cm["c"])  # 4(dict2 中找到)
    7. UserDictUserListUserString
  • 用途:继承并自定义字典、列表、字符串的行为(通过封装原生类型)。
  • 示例

    python

    from collections import UserDict
    
    class MyDict(UserDict):
        def __setitem__(self, key, value):
            super().__setitem__(key, value * 2)
    
    d = MyDict({"a": 1})
    d["b"] = 2  # 自动将值翻倍
    print(d)    # {'a': 1, 'b': 4}
  •  

    适用场景总结

    数据结构 典型场景
    namedtuple 替代简单类,表示不可变数据结构(如坐标、数据库记录)
    deque 高频头尾操作(如消息队列、滑动窗口算法)
    Counter 统计元素频率(如词频统计、投票计数)
    defaultdict 处理缺失键的字典(如分组聚合、树形结构)
    OrderedDict 需要保持插入顺序或手动调整顺序的字典
    ChainMap 多层级配置覆盖(如默认配置 + 用户配置 + 环境配置)

     

    注意事项

    1. 性能优化

    2. deque 的头部操作复杂度为 O(1),而 list 的头部插入/删除为 O(n)。
    3. Counter 的 update() 方法比手动循环更高效。
    4. 版本兼容性

    5. Python 3.7+ 的普通 dict 已支持有序性,OrderedDict 主要用于旧版本或额外方法。
    6. 线程安全

    7. collections 中的数据结构默认非线程安全,需自行加锁。

    总结

  • 核心数据结构namedtupledequeCounterdefaultdict 最常用。
  • 扩展性:通过 UserDictUserList 等可自定义容器行为。
  • 高效性:针对特定场景优化性能(如 deque 的双端操作)。
  • 作者:wanglaqqqq

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python中collections模块的深度解析

    发表回复