python中的collections模块
前言
Python中内置了4种数据类型,包括:list,tuple,set,dict,这些数据类型都有其各自的特点,但是这些特点(比如dict无序)在一定程度上对数据类型的使用产生了约束,在某些使用场景下效率会比较低,比如有时候我们可能需要维护一个有序的字典等情况。
在这种场景下我们可以使用Python内建的collections模块,它包括了很多有用的集合类,合理的使用可以提高我们代码的运行效率。
接下来主要对 collections 模块中的常用集合类进行介绍,调用 collections 模块:
from collections import *
defaultdict
dict在使用时,当key值不存在时,直接添加value时会出现错误,使用defaultdict可以很好的规避该错误。
defaultdict是对字典类型的补充,它可以给字典的值设置一个类型,当key不存在时可以自动生成相应类型的value。
例如:
from collections import defaultdict test_data = ( ('cat', 2), ('dog', 5), ('sheep', 3), ('cat', 1), ('sheep', 2) ) test_data_dict = defaultdict(list) for name, num in test_data: test_data_dict[name].append(num) print(test_data_dict) print(dict(test_data_dict))
运行结果:
defaultdict(<class 'list'>, {'cat': [2, 1], 'dog': [5], 'sheep': [3, 2]})
{'cat': [2, 1], 'dog': [5], 'sheep': [3, 2]}
orderedDict
在Python3.6之前的字典是无序的,但是有时候我们需要保持字典的有序性,orderDict可以在dict的基础上实现字典的有序性,这里的有序指的是按照字典key插入的顺序来排列,这样就实现了一个先进先出的dict,当容量超出限制时,先删除最早添加的key。
代码示例:
from collections import OrderedDict original_dict = {'a': 2, 'b': 4, 'c': 5} print('dict.keys():', original_dict.keys(), type(original_dict.keys()), sep='\t') print('dict.values():', original_dict.values(), type(original_dict.values()), sep='\t') print(list(zip(tuple(original_dict.keys()), tuple(original_dict.values())))) for key, value in original_dict.items(): print(key, value) ordered_dict = OrderedDict(list(zip(tuple(original_dict.keys()), tuple(original_dict.values())))) for key, value in ordered_dict.items(): print(key, value)
运行结果:
可以看到orderDict是按照字典创建时的插入顺序来排序。
deque
Python中的list是基于数组实现的,所以,查找容易,但是插入和删除操作时间复杂度较大。
deque就是为了高效实现插入和删除操作的双向列表,适合用于队列和栈,而且线程安全。
list只提供了append/pop方法来从list的尾部插入或者删除元素,deque新增了 appendleft/popleft等方法可以更高效的在元素的开头来插入/删除元素。
代码示例:
from collections import deque d = deque([1, 2, 3, 4, 5]) d.extendleft([0]) # extendleft默认在列表左边新增元素0 print(d, list(d), sep='\t') d.extend([6, 7]) # extend默认在列表右边新增元素6、7 print(d, list(d), sep='\t') d.popleft() # popleft默认删除列表左边的一个元素0 print(d, list(d), sep='\t')
运行结果:
可以在列表中进行双向操作元素,十分方便。
Counter
字典子类,为可以哈希的对象计数。
代码示例:
from collections import Counter test_counter_data = ['cat', 'dog', 'sheep', 'cat', 'dog'] counter_data = Counter() for item in test_counter_data: counter_data[item] += 1 print(counter_data, dict(counter_data), sep='\t')
运行结果:
可以实现对一个对象中的元素(上述代码中如列表中的元素)进行计数。
namedtuple
元组子类。
Python中元组的一个重要特征就是元素不可增删改,而查找tuple元素时一般采取索引。
使用 namedtuple(typename, field_name)可以命名tuple中的元素,之后便可使用名字来查找tuple中的值,有点类似于字典中的查找。
代码示例:
from collections import namedtuple animal = namedtuple('animal', 'type age') # 将animal元组(元组中包含type、age两个元素)转换为<class '__main__.animal'>对象 print(animal) mark = animal(type='dog', age=2) # 为元组tuple中的元素命名 print(mark.type)
运行结果:
使用namedtuple可以提高代码的可读性和文档性。
https://www.cnblogs.com/dianel/p/10787693.html#counter
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!