Python collections模块详解:namedtuple、deque、defaultdict、OrderedDict与Counter用法

拾光
拾光
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析Python内置collections模块的五大核心数据结构。通过namedtuple实现具名元组,利用deque优化双端队列插入删除效率,使用defaultdict处理缺失键默认值,借助OrderedDict保持插入顺序及实现FIFO缓存,以及利用Counter进行高效字符统计。涵盖具体代码示例与性能对比,帮助开发者根据场景选择合适的数据类型。

Python collections模块概述

collections是Python标准库中的一个集合模块,内置了多种高效且实用的集合数据类型。

下面将通过几个典型示例,展示这些类的具体应用场景。

namedtuple:具名元组

namedtuple

我们知道,tuple类型用于表示不可变的集合。例如,二维平面上的一个点可以用坐标表示为:


>>> p = (1, 2)

然而,直接查看(1, 2)这样的元组时,很难直观判断其代表的是坐标还是其他数值。

如果为此专门定义一个class类,又显得过于繁琐。此时,namedtuple便派上了用场:


>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2

namedtuple是一个工厂函数,用于创建具有指定字段数量的自定义tuple子类。它允许通过属性名而非索引来访问元组中的元素。

使用namedtuple,我们可以轻松定义一种兼具tuple不可变特性与属性访问便利性的数据类型,使用体验非常便捷。

我们可以验证创建的Point对象确实是tuple的子类:


>>> isinstance(p, Point)
True
>>> isinstance(p, tuple)
True

同理,若需表示带有坐标和半径的圆形,也可利用namedtuple进行定义:


# namedtuple('名称', [属性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])

deque:双端队列

deque

在使用list存储数据时,通过索引访问元素的速度很快。但由于list是线性存储结构,当数据量较大时,在中间插入或删除元素的效率会显著降低。

deque(双端队列)专为高效实现插入和删除操作而设计,非常适合用于构建队列或栈结构:


>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])

deque不仅支持list的append()和pop()方法,还额外提供了appendleft()和popleft()方法,从而能够极其高效地在列表头部添加或删除元素。

defaultdict:默认值字典

defaultdict

在使用普通dict时,如果访问不存在的Key,程序会抛出KeyError异常。若希望在Key不存在时返回一个默认值,可以使用defaultdict:


>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默认值
'N/A'

需要注意的是,默认值是通过调用传入的函数生成的,该函数在创建defaultdict对象时指定。

除了处理Key不存在时返回默认值这一特性外,defaultdict的其他行为与普通dict完全一致。

OrderedDict:有序字典

OrderedDict

在使用普通dict时,Key是无序的。在对dict进行迭代时,无法保证Key的输出顺序。

如果需要保持Key的插入顺序,可以使用OrderedDict:


>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict的Key是无序的
{'a': 1, 'c': 3, 'b': 2}
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

需注意,OrderedDict中的Key是按照插入顺序排列的,而非根据Key本身的大小进行排序:


>>> od = OrderedDict()
>>> od['z'] = 1
>>> od['y'] = 2
>>> od['x'] = 3
>>> od.keys() # 按照插入的Key的顺序返回
['z', 'y', 'x']

OrderedDict还可用于实现FIFO(先进先出)字典。当字典容量超过预设限制时,它会优先删除最早添加的Key:


from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict):
 def __init__(self, capacity):
  super(LastUpdatedOrderedDict, self).__init__()
  self._capacity = capacity
 def __setitem__(self, key, value):
  containsKey = 1 if key in self else 0
  if len(self) - containsKey >= self._capacity:
   last = self.popitem(last=False)
   print 'remove:', last
  if containsKey:
   del self[key]
   print 'set:', (key, value)
  else:
   print 'add:', (key, value)
  OrderedDict.__setitem__(self, key, value)

Counter:计数器

Counter

Counter是一个简单的计数器类,例如用于统计字符出现的频率:


>>> from collections import Counter
>>> c = Counter()
>>> for ch in 'programming':
...  c[ch] = c[ch] + 1
...
>>> c
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})

Counter实际上是dict的一个子类。从上述结果可以看出,字符'g'、'm'、'r'各出现了两次,而其他字符各出现了一次。

总结与补充

小结

collections模块提供了一系列有用的集合类,开发者可根据具体需求灵活选用。

知识点补充:

在Python内置数据类型(dict、list、set、tuple)的基础上,collections模块还扩展提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

1.namedtuple:生成可以使用名字来访问元素内容的tuple

2.deque:双端队列,支持从两端快速追加和推出对象

3.Counter:计数器,主要用于元素计数

4.OrderedDict:有序字典

5.defaultdict:带有默认值的字典

以上就是Python中内建模块collections如何使用的详细内容,更多关于详解Python中的内建模块collections的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。