百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

如何在Python 3中使用collections模块

off999 2024-10-01 13:53 26 浏览 0 评论

本文最初发表在DigitalOcean的公共知识库中。我在这里对它进行了一些较小的编辑。

介绍

Python 3有许多内置的数据结构,包括元组、字典和列表。数据结构为我们提供了一种组织和存储数据的方法。collections模块能够帮助我们高效地填充和操作数据结构。

在本教程中,我们将通过collections模块中的三个类来帮助你处理元组、字典和列表。我们将使用namedtuples来创建带有命名字段的元组,使用defaultdict来在字典中精确地分组信息,以及使用deque来高效地向一个类列表对象的每一边添加元素。

在本教程中,我们将主要处理一个鱼类清单,当在虚构的水族箱中添加或删除鱼类时,我们需要修改这些清单。

必备条件

要充分理解本教程,建议你熟悉元组、字典和列表数据类型(包括它们的语法),以及如何从它们中检索数据。你可以查看这些教程,以获得必要的背景信息:

  • 理解Python 3中的元组

  • 理解python3中的字典

  • Python 3中的理解列表

向元组添加命名字段

Python元组是一个不可变的,或不可改变的,有序的元素序列。元组经常用来表示纵列数据;例如,一个CSV文件中的行数或一个SQL数据库中的行数。一个水族箱可以用一系列元组来记录它的鱼类的库存。

一个单独的鱼类元组:

这个元组由三个字符串元素组成。

虽然在某些方面很有用,但是这个元组并没有清楚地指明它的每个字段代表什么。实际上,元素0是一个名称,元素1是一个物种,元素2是一个饲养箱。

鱼类元组字段说明:

这个表清楚地表明,该元组的三个元素都有明确的含义。

来自collections模块的namedtuple允许你向一个元组的每个元素添加显式名称,以便在你的Python程序中明确这些元素的含义。

让我们使用namedtuple来生成一个类,从而明确地命名鱼类元组的每个元素:

from collections import namedtuple 可以让你的Python程序访问namedtuple工厂函数。namedtuple函数调用会返回一个绑定到名称Fish的类。namedtuple函数有两个参数:我们的新类“Fish”的期望名称和命名元素["name"、"species”、“tank"]的一个列表。

我们可以使用Fish类来表示前面的鱼类元组:

如果我们运行这段代码,我们将看到以下输出:

sammy是使用Fish类进行实例化的。sammy是一个具有三个明确命名元素的元组。

sammy的字段可以通过它们的名称或者一个传统的元组索引来访问:

如果我们运行这两个print调用,我们将看到以下输出:

访问.species会返回与使用[1]访问sammy的第二个元素相同的值。

使用collections模块中的namedtuple可以在维护元组(即它们是不可变的、有序的)的重要属性的同时使你的程序更具可读性。

此外,namedtuple工厂函数还会向Fish实例添加几个额外的方法。

使用._asdict将一个实例转换为字典:

如果我们运行print,你会看到如下输出:

在sammy上调用.asdict将返回一个字典,该字典会将三个字段名称分别映射到它们对应的值。

大于3.8的Python版本输出这一行的方式可能略有不同。例如,你可能会看到一个OrderedDict,而不是这里显示的普通字典。

备注: 在Python中,带有前导下划线的方法通常被认为是“私有的”。但是,namedtuple提供的其他方法(如._asdict、._make、._replace等)是公开的。

在字典中收集数据

在Python字典中收集数据通常是很有用的。collections模块中的defaultdict可以帮助我们快速、简洁地将信息集合到字典中。

defaultdict绝不会引发一个KeyError。如果一个键不存在,defaultdict会插入并返回一个占位符值来代替:

如果我们运行这段代码,我们将看到如下输出:

defaultdict会插入并返回一个占位符值,而不是引发一个KeyError。在本例中,我们将占位符值指定为一个列表。

相比之下,常规字典会在缺失的键上引发一个KeyError:

如果我们运行这段代码,我们将看到如下输出:

当我们试图访问一个不存在的键时,常规字典my_regular_dict会引发一个KeyError。

defaultdict的行为与常规字典不同。defaultdict会不带任何参数调用占位符值来创建一个新对象,而不是在缺失的键上引发一个KeyError。在本例中,是调用list创建一个空列表。

继续我们虚构的水族箱示例,假设我们有一个表示水族箱清单的鱼类元组列表:

水族箱中有三种鱼——它们的名字、种类和饲养箱在这三个元组中都有指出。

我们的目标是按饲养箱组织我们的清单—我们想知道每个饲养箱中存在的鱼的列表。换句话说,我们需要一个能将“tank-a”映射到["Jamie", "Mary"] ,并且将“tank-b”映射到["Jamie"]的字典。

我们可以使用defaultdict来按饲养箱对鱼进行分组:

运行这段代码,我们将看到以下输出:

fish_names_by_tank被声明为一个defaultdict,它默认会插入list而不是引发一个KeyError。由于这保证了fish_names_by_tank中的每个键都将指向一个list,所以我们可以自由地调用.append来将名称添加到每个饲养箱的列表中。

这里,defaultdict帮助你减少了出现未预期的KeyErrors的机会。减少未预期的KeyErrors意味着你可以用更少的行更清晰地编写你的程序。更具体地说,defaultdict习惯用法让你避免了手动地为每个饲养箱实例化一个空列表。

如果没有 defaultdict, for循环体可能看起来更像这样:

使用常规字典(而不是defaultdict)意味着for循环体总是必须检查fish_names_by_tank中给定的tank是否存在。只有在验证了fish_names_by_tank中已经存在tank,或者已经使用一个初始化了tank之后,我们才可以添加鱼类名称。

在填充字典时,defaultdict可以帮助我们减少样板代码,因为它从不引发KeyError。

使用deque有效地将元素添加到集合的任意一侧

Python列表是一个可变的,或可改变的,有序的元素序列。Python可以以常数时间向列表添加内容(列表的长度对添加元素所需的时间没有影响),但是在列表的开头插入可能比较慢——随着列表变大,插入花费的时间也会增加。

就大O符号而言,向列表追加元素操作是一个常数时间O(1)操作。相比之下,在列表的开头插入元素要慢一些,其性能为O(n)。

备注:软件工程师经常使用称为“大O”符号的东西来度量操作的性能。当一个输入的大小对执行一个操作所需的时间没有影响时,我们就可以说该操作以常数时间或 O(1)(“1的大O”)运行。正如你在上面所了解的,Python可以以常数时间性能(也称为O(1))向列表中追加元素。

有时候,输入的大小会直接影响运行一个操作所需的时间。例如,在一个Python列表的开头插入元素时,列表中的元素越多,插入操作的运行速度越慢。大O符号使用字母n表示输入的大小。将项目添加到Python列表的开头以“线性时间”或 O(n)(“n的大O”)运行。

一般来说,O(1)个操作比O(n)个操作更快。

我们可以在一个Python列表的开头插入:

如果我们运行以上代码,我们将看到如下输出:

列表上的.insert(index, object)方法允许我们在favorite_fish_list的开头插入“Alice”。不过,值得注意的是,在一个列表的开头插入项具有O(n)性能。随着favorite_fish_list的长度的增长,在列表的开头插入一个鱼类的时间将成比例地增长,所需时间会越来越长。

collections模块中的deque(发音为“deck”)是一个类似列表的对象,它允许我们以常数时间(O(1))性能在一个序列的开头或末尾插入项。

在一个deque的开头插入一个项:

运行这段代码,我们将看到以下输出:

我们可以使用一个先前存在的元素集合来实例化一个deque,在本例中,该集合是三个最喜欢的鱼类名称的一个列表。调用favorite_fish_deque’s appendleft方法允许我们以O(1)性能在我们集合的开头插入一个项。O(1)性能意味着将一个项添加到 favorite_fish_deque 的开头所花费的时间并不会增加,即使favorite_fish_deque中有数以千计甚至数以百万计的元素。

备注: 尽管deque将条目添加到一个序列的开头比列表更有效,但并不是deque执行所有操作都比列表更高效。例如,访问deque中的一个随机项具有O(n)性能,但是访问列表中的一个随机项具有O(1)性能。当需要快速地从你的集合的任意一侧插入或删除元素时,请使用deque。时间性能的完整比较可以在Python的wiki上找到。

结论

collections模块是Python标准库的一个功能强大的部分,它允许你简洁高效地处理数据。本教程介绍了collections模块提供的三个类,包括namedtuple、 defaultdict和deque。

英文原文:https://davidmuller.github.io/posts/2020/05/08/collections-module-Python3.html
译者:浣熊君( ????? )

相关推荐

winxp系统版本(winxp 版本)

1、微软官方3个版本:WINDOWSXPHOME(家庭版)、Professional(专业版)、MediaCenter2005(媒体中心版),每个版本的功能不一样。使用最多的是Professional...

打印机无法共享怎么回事(打印机无法共享出去)

共享打印机无法打印原因一:可能是由于病毒死机解决方法:确定是否由于病毒死机,找一张干净(确信无病毒)的系统盘,从A驱动舒上启动电脑,检查此时打印机和主机能否联机。如果正常联机,估计这种故障是由攻击硬件...

ipv6无网络访问权限怎么解决

ipv6无网络访问权限解决方法如下1、点击电脑左下角的开始,进入到开始的菜单栏,在菜单栏中找到“运行”。或者通过快捷键Windows+R打开运行窗口。  2、打开运行的窗口页面后,在页面上输入“CMD...

office ltsc版(Office LTSC版本区别)

office2021和2021ltsc的区别如下:1.更新策略不同。前者采用每个月月度更新的方法,提供功能更新、安全更新。后者不采用每个月月度更新的方法,且不提供功能更新。2.界面不同。2021采用了...

安装win7需要激活吗(现在安装win7旗舰版还需密钥吗)

要激活  Windows7如果是预装在计算机中的,买来之后便不用激活,这里预装指的是在厂商那里。正版的Windows7安装到计算机中,有三十天的试用期,若要永久使用,就要使...

originos 3升级计划公布(originos升级包)

2023年2月。1.OriginOS3.0系统第一批升级时间为11月25日。2、包含iQOONeo7,X80系列,S15系列,iQOO9、iQOO10系列,以及折叠屏XFold系列和大屏XNo...

鸿蒙系统适配第三方机型(鸿蒙 第三方适配)

最新华为官方公布了鸿蒙系统3.0支持的机型名单,具体如下。鸿蒙系统3.0升级名单:1.Mate系列:MateXs2、MateX2、MateXs、Mate40、Mate40Pro、Mate...

imei怎么下载(imei changer apk)

如果您的steam序列号激活了,可以尝试以下方法下载:1.使用steam自带的下载工具,如“下载工具”,在软件的“下载”选项卡中选择“序列号下载”。2.在下载页面中,选择要下载的游戏,然后点击“下...

电脑系统优化软件哪个好(系统优化软件排行榜)

有必要用,非常好用,WINDOWS优化大师是一个网络上下载率极高的系统维护软件。多年未曾清理过系统和硬盘的电脑,系统内部将产生大量的垃圾文件、临时文件、废旧程序等等win10系统不需要经常更新,关闭...

重装系统后硬盘不见了(重装系统后磁盘不见了)

硬盘不见可能是因为重装系统时未正确安装驱动程序或未对硬件进行正确设置。你可以按以下步骤排查问题:进入BIOS检查硬盘是否被识别,尝试重新连接数据线和电源线,更新或安装适当的硬件驱动程序,或者使用硬件故...

冰封u盘装win7系统教程图解(冰封u盘启动装机教程)

1.查找激活工具:通常来说,Win7冰封系统已经包含了必要的驱动,所以如果你的电脑上并没有出现设备错误,那你就可以正常使用。如果你需要添加任何驱动,请尝试从厂商下载相应的驱动并执行自动安装程序。如果...

ppt软件电脑版推荐(电脑ppt软件下载哪个版好)
  • ppt软件电脑版推荐(电脑ppt软件下载哪个版好)
  • ppt软件电脑版推荐(电脑ppt软件下载哪个版好)
  • ppt软件电脑版推荐(电脑ppt软件下载哪个版好)
  • ppt软件电脑版推荐(电脑ppt软件下载哪个版好)
兄弟打印机怎么连接wifi(兄弟打印机怎么连接wifi手机打印)
  • 兄弟打印机怎么连接wifi(兄弟打印机怎么连接wifi手机打印)
  • 兄弟打印机怎么连接wifi(兄弟打印机怎么连接wifi手机打印)
  • 兄弟打印机怎么连接wifi(兄弟打印机怎么连接wifi手机打印)
  • 兄弟打印机怎么连接wifi(兄弟打印机怎么连接wifi手机打印)
uefi模式下找不到硬盘(uefi引导找不到硬盘)

首先你的安装盘必须是从UEFI启动的,然后它才能安装为UEFI启动。(条件:Fat32文件系统,efi文件夹)其次你MBR+BIOS的系统想换成GPT+EFI的,分区得做一点改动,腾出来100M的空...

win7怎么安装蓝牙驱动程序(win7电脑安装蓝牙驱动教程)

方法如下:  1、再开始里点击控制版面,点击【硬件和声音】找到【添加设备】  2、之后再选择你要添加的蓝牙耳机。  3、系统就会提示正在与蓝牙适配器连接,然后提示添加成功。  4、点击“开始”-“...

取消回复欢迎 发表评论: