collections模块基本介绍

大家都知道python有一些内置的数据类型,比如str, int, tuple, dict, list等。

collections模块在这些基础上,提供了几个额外的数据类型:
1.namedtuple() 生成可以使用名字来访问元素内容的tuple子类(还可用于判断类型)
2.deque(): 双端队列(list长度过长时推荐使用),还可以限定队列长度,适合队列和栈操纵。
3.Counter: 计数器
4.OrderDict: 有序字典
5.defaultDict: 带有默认值的字典

  1. namedtuple()
    namedtuple主要用来产生可以使用名称来访问元素的数据对象,通常用来增强代码的可读性,来可以用来做验证。
    例如,一个点的二维坐标就可以表示成:
>>> p = (1, 2)

取值的时候只能通过下标的方式。
定义class又小题大做,这时候namedtuple就派上用场了

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

# 设置一个圆,x坐标, y坐标,r半径
>>>Circle = namedtuple('Circle', ['x', 'y', 'r'])

2.deque() 双端队列
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
list对象的insert和pop操作的时间复杂度是 O(n) ,也就是说随着元素数量的增加耗时呈 线性上升。而使用deque对象则是 O(1) 的复杂度,所以当你的代码有这样的需求的时候, 一定要记得使用deque
作为一个双端队列,deque还提供了一些其他的好用方法,比如 rotate 等

# -*- coding: utf-8 -*-
"""
下面这个是一个有趣的例子,主要使用了deque的rotate方法来实现了一个无限循环
的加载动画
"""
import sys
import time
from collections import deque
fancy_loading = deque('>--------------------')
while True:
    print '\r%s' % ''.join(fancy_loading),
    fancy_loading.rotate(1)
    sys.stdout.flush()
    time.sleep(0.08)
# Result:
# 一个无尽循环的跑马灯

双端队列还可以设置一个最大长度maxlen, 实现先进先出(FIFO)

>>> a = deque(maxlen=3)
>>> a
deque([], maxlen=3)
>>> a.append(1)
>>> a.append(2)
>>> a.append(3)
>>> a
deque([1, 2, 3], maxlen=3)
>>> a.append(4)
>>> a
deque([2, 3, 4], maxlen=3)
<think>好的,我现在要处理用户关于Pythoncollections模块的使用方法和功能的询问。首先,我需要回忆一下collections模块的主要组件和它们的作用。用户可能已经看过一些文档,但需要更清晰的解释和实际例子。 首先,用户提供的引用内容提到了collections模块中的几个数据结构,比如defaultdict、deque、Counter、OrderedDict等。我需要确保覆盖这些主要的类,并解释它们的用途和基本用法。 接下来,我需要检查是否有遗漏的重要数据结构。例如,namedtuple和ChainMap也是collections模块的一部分,应该在回答中提及。每个数据结构都需要一个简明的解释,可能的话,配上代码示例,这样用户更容易理解。 然后,考虑用户可能的疑问点。例如,defaultdict和普通dict的区别是什么?为什么使用deque而不是列表?这些点需要在介绍每个类的时候简要说明,突出它们的优势和适用场景。 另外,用户提供的引用中提到了性能优化,比如deque的高效插入和删除。这需要强调,特别是在处理队列和时的应用,对比列表操作的性能差异。 还需要注意代码示例的正确性。例如,在展示defaultdict时,确保导入正确,并且示例能清楚展示默认值的行为。同样,Counter的例子应该展示计数功能,如统计元素出现次数。 另外,用户可能对应用场景感兴趣,所以每个数据结构的典型使用场景需要简要说明。例如,Counter可以用于统计词频,deque适用于多线程任务队列等。 最后,生成的相关问题需要覆盖常见疑问,比如模块的其他功能、性能对比、实际应用案例等,这样可以引导用户进一步探索。 现在,我需要组织这些内容,确保结构清晰,分点介绍每个数据结构,每个部分包括功能、示例和优势。同时,保持语言简洁,避免技术术语过多,让初学者也能理解。 可能还需要检查是否有最新的Python版本中的变化,但根据引用内容,似乎都是基于标准库的现有功能,所以不需要考虑过时的信息。 总结一下,回答的结构应该是先概述collections模块,然后逐个介绍重要的类,每个类包含功能描述、代码示例和适用场景,最后生成相关问题供用户进一步学习。</think>### Python collections模块功能详解 Python的$collections$模块提供多种扩展数据结构,可显著提升开发效率。以下是核心组件及使用示例: --- #### 一、defaultdict:带默认值的字典 **功能**:自动为不存在的键生成默认值,避免$KeyError$。 ```python from collections import defaultdict word_count = defaultdict(int) words = ["apple", "banana", "apple"] for word in words: word_count[word] += 1 # 不存在时默认返回0 print(word_count) # defaultdict(<class 'int'>, {'apple': 2, 'banana': 1}) ``` **优势**:简化统计类代码逻辑[^3]。 --- #### 二、deque:双端队列 **功能**:支持高效头尾插入/删除($O(1)$时间复杂度)。 ```python from collections import deque queue = deque([1,2,3]) queue.appendleft(0) # 前端插入 queue.pop() # 后端删除 print(queue) # deque([0, 1, 2]) ``` **应用场景**:线程安全队列、滑动窗口算法[^1]。 --- #### 三、Counter:元素计数器 **功能**:快速统计可哈希对象的元素频率。 ```python from collections import Counter data = ["a", "b", "a", "c", "b", "a"] count = Counter(data) print(count.most_common(2)) # [('a', 3), ('b', 2)] ``` **特点**:提供$most_common(n)$直接获取高频元素[^2]。 --- #### 四、OrderedDict:有序字典 **功能**:记录键的插入顺序(Python 3.7+普通dict已支持,但需显式保证顺序时仍有用)。 ```python from collections import OrderedDict od = OrderedDict() od["z"] = 3 od["a"] = 1 print(list(od.keys())) # ['z', 'a'] ``` --- #### 五、namedtuple:命名元组 **功能**:创建具有字段名的元组类。 ```python from collections import namedtuple Point = namedtuple("Point", ["x", "y"]) p = Point(10, y=20) print(p.x, p.y) # 10 20 ``` **优势**:增强代码可读性,替代简单类。 --- #### 六、ChainMap:多字典链式查找 **功能**:将多个字典逻辑合并,按顺序查找键。 ```python from collections import ChainMap dict1 = {"a": 1, "b": 2} dict2 = {"b": 3, "c": 4} chain = ChainMap(dict1, dict2) print(chain["b"]) # 返回dict1中的2 print(chain["c"]) # 返回dict2中的4 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值