一文看懂Python collections模块的高效数据类型
原作: George Seif, 发表于medium.com, 大江狗原创翻译, 并对原文稍作修改。
Python的最大优势之一是其广泛的模块和软件包。这将Python的功能扩展到许多受欢迎的领域,包括机器学习、数据科学和Web开发等, 其中最好的模块之一是Python的内置collections 模块。
一般来讲,python的collections是用于存储数据集合(比如列表list, 字典dict, 元组tuple和集合set)的容器。这些容器内置在Python中,可以直接使用。该collections模块提供了额外的,高性能的数据类型,可以增强你的代码,使事情变得更清洁,更容易。
让我们看一看关于集合模块最受欢迎的数据类型以及如何使用它们的教程!
Counter
Counter()是字典对象的子类。Counter()可接收一个可迭代遍历的对象(例如字符串、列表或元组)作为参数,并返回计数器字典。字典的键将是可遍历对象中的唯一元素,每个键的值将是可迭代对象中的每个唯一元素对应的计数。
首先,让我们先从collections模块导入Counter这个数据类型:
from collections import Counter
要创建Counter对象,就像将其分配给其他任何对象类一样,将其分配给变量。您唯一要确保的是传递给它的参数是可迭代的对象。
lst = [1, 2, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 2, 1, 1]
counter = Counter(lst)
我们可以使用简单的打印功能比如print(counter)来查看我们获得的新的对象,它看起来像个字典,如下所示:
Conter ({1:7,2:2:5,3:3})
您可以使用键值key访问任何计数器条目,如下所示。这与从标准Python字典中提取元素的方式完全相同。
lst = [1, 2, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 2, 1, 1]
counter = Counter(lst)
print(counter[1]) # 返回7。1的数量有7个
most_common()函数
到目前为止,Counter对象最有用的功能是most_common()函数。将其应用于Counter对象时,它将返回N个最常见元素及其计数的列表,按从最常见到最不常见的顺序排列。
lst = [1, 2, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 2, 1, 1]
counter = Counter(lst)
print(counter.most_common(2)) # 返回最常见两个元素及其计数
上面的代码打印出以下元组列表:
[(1,7),(2,5)]
每个元组的第一个元素是列表中的唯一原始,每个元组的第二个元素是计数。这是一种快速简便的方法,实现比如“获取列表中最常见的3个元素及其计数”的功能。
要了解有关Counter功能的更多信息,请查阅官方文档。
defaultdict
defaultdict工作起来完全像一个普通的Python字典,但它有额外的奖励。当您试图访问一个不存在的键,它不会引发错误,而是使用不存在的键创建新的key,其对应的默认值是根据创建defaultdict对象时作为参数传递的数据类型自动设置的。请看下面的代码作为示例。
from collections import defaultdictnames_dict = defaultdict(int)
names_dict["Bob"] = 1
names_dict["Katie"] = 2
sara_number = names_dict["Sara"]
print(names_dict)
在上面的示例中,int作为默认初始化值传递给我们的defaultdict对象。接下来,为每个键"Bob"和"Katie"赋值。但是在最后一行,我们尝试访问一个尚未定义的键,即“ Sara”的键。
在普通字典中,这将引发错误。使用defaultdict后不再报错,而是自动以"Sara"创建一个新键key,其初始化值为0,是因为我们指定了int数据类型作为初始化值。
因此,最后一行打印出具有所有3个名称和相应值的字典。
defaultdict(<class 'int'>, {'Bob': 1, 'Katie': 2, 'Sara': 0})
如果要将设置列表类型数据做为一个key的初始化值,我们只需设置names_dict = defaultdict(list),此时“Sara”将使用空列表初始化[]。此时打印结果如下所示:
defaultdict(<class 'int'>, {'Bob': 1, 'Katie': 2, 'Sara': []})
要了解有关defaultdict功能的更多信息,请查阅官方文档。
deque
deque队列是在计算机科学里最基本的数据结构,遵循先入先出(FIFO)的原理。简单来说,这意味着添加到队列中的第一个对象也必须是要删除的第一个对象。我们只能在队列的前面插入内容,而只能从队列的后面删除内容,而队列中间没有任何动作。
collections模块提供的deque对象是能实现队列数据结构的优化版本。该功能的主要特色是能够保持队列的大小,即如果将队列的最大长度设置为10,则将deque根据FIFO原理添加和删除元素以保持最大长度始终为10。这是到目前为止,Python中队列的最佳实现。
让我们从一个例子开始。我们将创建一个deque对象,然后使用从1到10的整数进行初始化。
from collections import dequemy_queue = deque(maxlen=10)for i in range(10):my_queue.append(i+1)print(my_queue)
在上面的代码中,我们首先初始化deque,指定我们希望它始终保持最大长度为10。其次,当我们通过循环将值插入到队列中时。注意,填充队列的功能与使用常规Python列表的方式完全相同。最后,我们打印出结果。
deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], maxlen=10)
由于队列中有一个maxlen=10,并且循环中添加了10个元素,因此队列中包含了从1到10的所有数字。现在,让我们看看添加更多数字时会发生什么。
for i in range(10, 15):my_queue.append(i+1)print(my_queue)
在上面的代码中,我们在队列中添加了另外5个元素,数字从11到15。但是我们的队列只有一个,且maxlen=10。因此必须删除一些元素,才能插入新的元素。由于队列必须遵循FIFO原则,因此它将删除最先插入队列中的前5个元素,即[1、2、3、4、5]。打印语句的结果如下:
deque([6, 7, 8, 9, 10, 11, 12, 13, 14, 15], maxlen=10)
要了解有关该功能的更多信息deque,请查阅官方文档。
namedtuple
在Python中创建常规元组时,其元素是通用的且未命名,这迫使您记住每个元组元素的确切索引。可以使用具名元组namedtuple来解决这个问题。
该namedtuple()返回与用于所述元组中的每个位置和一个通用名固定名称的元组namedtuple对象。要使用namedtuple,请先为其创建一个模板。下面的代码创建一个namedtuple名为Person的模板,其属性为name,age和job。
from collections import namedtuplePerson = namedtuple('Person', 'name age job')
创建模板后,您可以使用它来创建namedtuple对象。让我们使用Person模板为2个人创建2个namedtuple对象,并打印它们。
Person = namedtuple('Person', 'name age job')Mike = Person(name='Mike', age=30, job='Data Scientist')
Kate = Person(name="Kate", age=28, job='Project Manager')print(Mike)
print(Kate)
上面的代码非常简单。我们使用namedtuple 模板的所有属性来初始化“人员” ,以后可以直接使用Mike或Kate使用元组元素,而不用再使用索引了。上面的打印语句将给出以下结果:
Person(name='Mike', age=30, job='Data Scientist')
Person(name='Kate', age=28, job='Project Manager')
因此,namedtuple能够更容易地使用,更合适元组对象的组织,可读性也更强。
要了解更多关于namedtuple的功能,请查阅官方文档。
OrderedDict
由于原文未介绍collections模块中的有序字典结构而OrderedDict又非常重要,这部分由大江狗手动新增。
在Python 3.5及以前之前版本,Python的字典dict是无序的。如果先键值A先插入字典,键值B后插入字典,但是当你打印字典的Keys列表时,你会发现B可能在A的前面。对于无序字典,每次打印字典时每次显示元素的顺序都不一样。如果你的Python版本较老,需要借助collections模块提供的OrderedDict实现有序字典。
OrderedDict类似于正常的字典,只是它记住了元素插入的顺序。当对有序的词字典上迭代时,返回元素的顺序是按第一次添加元素的顺序进行。当元素删除时,排好序的词典保持着排序的顺序;但是当新元素添加时,就会被添加到末尾。
OrderedDict实现方式如下:
dd = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
#按key排序
od_by_key = collections.OrderedDict(sorted(dd.items(), key=lambda t: t[0]))
print(od_by_key)
#按照value排序
od_by_value = collections.OrderedDict(sorted(dd.items(),key=lambda t:t[1]))
print(od_by_value)
#输出
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
Python collections模块的知识,你学到了吗?
原文链接
https://levelup.gitconnected.com/introducing-high-performance-datatypes-in-python-with-the-collections-library-3d8c334827a5
大江狗
2020.12
推荐阅读
一文看懂Python系列之值得收藏的10大PyCharm常用使用技巧(多图)
一文看懂Python列表、元组和字符串操作
一文看懂Python多进程与多线程编程(工作学习面试必读)
一文看懂Python列表表达式及高阶函数如lamda, zip, enumerate, map和filter方法
一文看懂Python多进程与多线程编程(工作学习面试必读)
一文看懂Python系列之装饰器(decorator)(工作面试必读)
一文看懂Python collections模块的高效数据类型相关推荐
- angular 字符串转换成数字_一文看懂Python列表、元组和字符串操作
好文推荐,转自CSDN,原作星辰StarDust,感觉写的比自己清晰-大江狗荐语. 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力 ...
- 一文看懂Python 爬虫 进阶(三)
一文看懂Python 爬虫 进阶(三) 文章目录 一文看懂Python 爬虫 进阶(三) **猫眼电影(xpath)** **链家二手房案例(xpath)** **百度贴吧图片抓取** 这篇几乎都是代 ...
- 一文看懂Python多进程与多线程编程(工作学习面试必读)
进程(process)和线程(thread)是非常抽象的概念, 也是程序员必需掌握的核心知识.多进程和多线程编程对于代码的并发执行,提升代码效率和缩短运行时间至关重要.小编我今天就来尝试下用一文总结下 ...
- python 推迟运行_一文看懂Python的time模块sleep()方法和strftime()方法
概述 今天主要介绍一下Python的time sleep()方法和strftime()方法. 一.Python time sleep()方法 Python time sleep() 函数推迟调用线程的 ...
- 一文看懂Python(四)-----os.path模块篇
一.前言 今天介绍一下Python中一个常用的模块–os.path模块.之后会很频繁地用到这个模块,故在分享一下! 二.常用方法解释 方法名 方法介绍 basename(path) 去掉目录路径,单独 ...
- c 提取引号中间的字符串_Python | 一文看懂Python列表、元组和字符串操作
好文推荐,转自CSDN,原作星辰StarDust 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力. 列表.元组.字符串都属于序列 ...
- python运行程序-一文看懂python程序的执行过程
本文主要介绍的是python程序的执行过程,首先介绍的是编译过程,其次介绍的是过程图解及编译字节码,最后介绍了codeobject对象的属性,具体的跟随小编一起来了解一下. 一.编译过程概述 当我们执 ...
- 一文看懂Python(五)-----文件篇
一.前言 文件操作在所有编程语言中都扮演着一个非常重要的角色,编程语言中的文件操作都大同小异,无非就是读取和写入,本文会详细介绍Python的相关文件操作,包括常用的方法.方法如何使用.一些小的案例以 ...
- angular 字符串转换成数字_Python | 一文看懂Python列表、元组和字符串操作
好文推荐,转自CSDN,原作星辰StarDust 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力. 列表.元组.字符串都属于序列 ...
最新文章
- tp3.2php开启事务,Thinkphp 3.2.3 开启调试模式
- AC日记——字符替换 openjudge 1.7 08
- CLOUD信用管理设置
- iOS-高仿通讯录之商品索引排序搜索
- JavaScript 开发进阶:理解 JavaScript 作用域和作用域链
- css part 2
- [POJ2195]Going Home(带权最大匹配,KM,最小费用流)
- NO.5 Android Opencv 相机人脸识别
- ILSVRC2012下载+训练
- Whatsapp注册步骤
- P2893 [USACO08FEB] Making the Grade G(dp优先队列)
- [原创]windows server 2012 AD架构 试验 系列 – 17管理用户AD帐号
- oracle查看日期是第几周
- 美图嗅嗅+到意大利的水族馆里吃西餐
- c语言若输入错误的是,C语言新人常见问题与错误
- 百度天气预报接口使用详细
- 控制台输出——键盘图形
- SQL文件的导入与导出
- 线性模型之二:线性回归模型性能的评估(残差图、MSE与R2)
- 360安全服务器组件怎样禁止,如何禁用360安全浏览器服务组件?如何正确的操作...