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. 性能优化

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

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

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

总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值