0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python collections模块最受欢迎的四种数据类型

智能感知与物联网技术研究所 来源:通信信号处理研究所 2019-11-20 15:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在这篇文章中,机器学习工程师 George Seif 介绍了 Python collections 模块最受欢迎的四种数据类型以及它们各自的使用方法。这些数据类型可以对代码进行优化,进而实现更简洁的任务执行。

Python 的最大优势之一就是它有各种各样的模块和软件包可供选择。这些模块和包将 Python 的功能扩展到了许多流行领域,包括机器学习、数据科学、Web 开发和前端等。其中表现最好的一个就是 Python 内置的 collections 模块了。

一般而言,Python 中的 collections 模块是用于存储列表、字典、元组以及集等数据集合的容器。这些容器嵌入在 Python 中,可以实现开箱即用。collections 模块提供了额外的高性能数据类型,它们可以优化代码,让一些任务变得更加简洁。

本文作者 George Seif(机器学习工程师)。

Counter

官方文档:https://docs.python.org/2/library/collections.html#collections.Counter

Counter 是 dictionary 对象的子类。collections 模块中的 Counter() 函数会接收一个诸如 list 或 tuple 的迭代器,然后返回一个 Counter dictionary。这个 dictionary 的键是该迭代器中的唯一元素,每个键的值是迭代器元素的计数。

首先,我们需要从 collections 包中导入 Counter:

fromcollectionsimportCounter

如果要创建一个 Counter 对象,我们也要像对待其他对象类一样,先将它分配给一个变量,而传递给 Counter 对象的惟一变量即是迭代器。

lst=[1,2,3,3,2,1,1,1,2,2,3,1,2,1,1]
counter=Counter(lst)

如果我们使用简单的 print 函数(print(counter))把这个 Counter 打印出来,则会得到一些与 dictionary 稍微类似的输出:

Counter({1:7,2:5,3:3})

你可以用这些键值访问任何 Counter 项。这与从标准的 Python dictionary 中获取元素的方法完全相同。

lst=[1,2,3,3,2,1,1,1,2,2,3,1,2,1,1]
counter=Counter(lst)
print(counter[1])

most_common() 函数

目前来说,Counter 对象中最有用的函数是 most_common()。当它应用于一个 Counter 对象时,会返回一个 list,这个 list 包含了前 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))

上述代码会打印出以下 tuples 的 list。

[(1,7),(2,5)]

每个 tuple 的首个元素是 list 中的唯一项,第二个元素是计数值。对于「获取 list 中前 3 常见的元素及其计数」这样的问题,这会是一种快速且简单的方法。

如果要了解更多关于 Counter 的功能,可以查看官方文档。

defaultdict

官方文档:https://docs.python.org/2/library/collections.html#collections.defaultdict

defaultdict 的工作方式和平常的 python dictionary 完全相同,只是当你试图访问一个不存在的键时,它不会报错,而是会使用默认值初始化这个键。默认值是根据在创建 defaultdict 对象时作为参数输入的数据类型自动设置的。下面的代码就是一个例子。

相反,它会使用默认值初始化这个键。默认值是根据在创建 defaultdict 对象时作为参数输入的数据类型自动设置的。下面的代码就是一个例子。

fromcollectionsimportdefaultdict

names_dict=defaultdict(int)
names_dict["Bob"]=1
names_dict["Katie"]=2
sara_number=names_dict["Sara"]
print(names_dict)

在上面的示例中,传递给 defaultdict 对象的默认值是 int。然后每个键得到了一个值,也就是「Bob」和「Katie」各获得了一个数字。但是在最后一行,我们试着访问了一个尚未定义的键,即「Sara」。

在普通 dictionary 中,这种操作会报错。但是使用 defaultdict 时,将自动为「Sara」初始化一个新键,其值 0 对应于我们的 int 数据类型。因此,最后一行可以把这「Bob」、「Katie」和「Sara」以及对应的值都打印出来。

defaultdict(,{'Bob':1,'Katie':2,'Sara':0})

如果我们改用 list 来初始化我们的 defaultdict,也就是 names_dict = defaultdict(list),那么「Sara」的值将被初始化成一个空列表 [],打印来的内容就变成了:

defaultdict(,{'Bob':1,'Katie':2,'Sara':[]})

如果要了解更多关于 defaultdict 的功能,可以查看官方文档。

deque

官方文档:https://docs.python.org/2/library/collections.html#collections.deque

queue 是计算机科学中的一种基础数据架构,它遵循先进先出(First-In-First-Out,FIFO)的原则。简单来说,就是添加到 queue 中的第一个对象也必须是要第一个删除。我们只能在 queue 前面插入内容,也只能从后面删除内容——无法对中间内容进行操作。

collections 库中的 deque 对该功能进行了优化。这个方法的一个关键特性是保持队列长度一直不变,也就是说,如果你将 queue 的最大大小设置为 10,那么 deque 将根据 FIFO 原则添加和删除元素,以保持 queue 的最大大小为 10。这是迄今为止 Python 中使用 queue 的最好方法了。

再来看一个例子。我们先创建了一个 deque 对象,然后用从 1 到 10 的整数初始化它。

fromcollectionsimportdeque

my_queue=deque(maxlen=10)

foriinrange(10):
my_queue.append(i+1)

print(my_queue)

在上面的代码中,我们首先初始化 deque,指定它的最大长度为 10。然后,我们通过 for loop 将值插入到 queue 中。注意这里我们使用了与常见 Python list 相同的方式填充 queue。最后,我们把结果打印出来。

deque([1,2,3,4,5,6,7,8,9,10],maxlen=10)

因为我们的 queue 被设置成 maxlen=10,而 loop 值添加了 10 个元素,所以这个 queue 包含了从 1 到 10 的所有数字。现在我们来看一下如果继续向里面添加数字会发生什么。

foriinrange(10,15):
my_queue.append(i+1)

print(my_queue)

在上述代码中,我们又向 queue 中添加了 5 个元素——数字 11 到 15。但是我们的 queue 只能有 10 个元素,所以它需要删除一些元素。因为 queue 必须服从 FIFO 原则,所以它删掉了前五个插入到 queue 中的元素,按照插入顺序就是 [1, 2, 3, 4, 5]。打印的结果如下:

deque([6,7,8,9,10,11,12,13,14,15],maxlen=10)

如果要了解更多关于 deque 的功能,可以查看官方文档。

namedtuple

官方文档:https://docs.python.org/2/library/collections.html#collections.namedtuple

当你使用 python 创建一个常规 tuple 时,其元素都是通用的,而且没有被命名。这使得你必须记住每个 tuple 元素的精确索引。namedtuple 就可以解决这个问题。

namedtuple() 可以返回一个 tuple,该 tuple 中的每个位置都有固定名称,而且 namedtuple 对象也有通用名称。要使用 namedtuple,需要先为其创建一个模板。下面的代码创建了一个名为「Person」的 namedtuple 模板,其属性为「name」、「age」和「job」。

fromcollectionsimportnamedtuple

Person=namedtuple('Person','nameagejob')
Oncethetemplateiscreated,youcanuseittocreatenamedtupleobjects.Let’screate2namedtuple’sfor2Personsandprintouttheirrepresentation.
Person=namedtuple('Person','nameagejob')

Mike=Person(name='Mike',age=30,job='DataScientist')
Kate=Person(name="Kate",age=28,job='ProjectManager')

print(Mike)
print(Kate)

上述代码很容易理解,我们为 namedtuple 初始化了一个「Person」模板,并初始化了其所有的属性。上述代码最后的打印结果是:

Person(name='Mike',age=30,job='DataScientist')
Person(name='Kate',age=28,job='ProjectManager')

因此,namedtuple 让 tuple 的使用更简单、更可读且更有组织性。

如果要了解更多关于 namedtuple 的功能,可以查看官方文档。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    67

    文章

    8561

    浏览量

    137208
  • python
    +关注

    关注

    58

    文章

    4883

    浏览量

    90294

原文标题:四种高性能数据类型,Python collections助你优化代码、简洁任务

文章出处:【微信号:tyutcsplab,微信公众号:智能感知与物联网技术研究所】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于凌羽派的OpenHarmony北向应用开发:ArkTS语法-数据类型和变量声明

    可以在程序执行期间具有不同的值。使用TS风格,声明的时候使用冒号给出数据类型。 let hi: string = \'hello\'; let num: number = 0; 2.2 常量声明
    发表于 02-26 14:24

    睿远研究院丨IO-Link规范解读(十五):数据类型详解

    前言 本篇对IO-Link规范的附录F的数据类型做个详细解释,附录定义了  基本数据类型 (Basic Data Types) 和  组合数据类型 (Composite Data Types),并
    的头像 发表于 01-14 18:25 5979次阅读
    睿远研究院丨IO-Link规范解读(十五):<b class='flag-5'>数据类型</b>详解

    2025年北汇信息在电子发烧友的十大最受欢迎文章

    的广泛关注,故整理了最受欢迎的十大文章,看看大家最关心的是哪些内容。 2026年,欢迎大家多多交流和反馈,有什么感兴趣的的汽车电子测试相关的内容,我们会努力原创,更多
    的头像 发表于 12-29 14:39 471次阅读
    2025年北汇信息在电子发烧友的十大<b class='flag-5'>最受欢迎</b>文章

    最受欢迎的大数据可视化工具

    :  能够处理不同种类型的传入数据  能够应用不同种类的过滤器来调整结果  能够在分析过程中与数据集进行交互  能够连接到其他软件来接收输入数据,或为其他软件提供输入
    的头像 发表于 12-24 17:05 363次阅读
    <b class='flag-5'>最受欢迎</b>的大<b class='flag-5'>数据</b>可视化工具

    WTK6900FC鼾声识别芯片在四种助眠场景中的应用

    WTK6900FC鼾声识别芯片在四种助眠场景中的应用 “跟你说个搞笑的事情,我刚才午睡的时候被我自己的呼噜声吵醒了...”这是真实发生在身边的事情。 ​ 过去对于打呼噜这件事情,大家的态度就是“累了
    的头像 发表于 12-02 16:40 839次阅读
    WTK6900FC鼾声识别芯片在<b class='flag-5'>四种</b>助眠场景中的应用

    C语言自动类型转换

    一、自动类型转换 数据类型存在自动转换的情况. 自动转换发生在不同数据类型运算时,在编译的时候自动完成。 char类型数据转换为int
    发表于 11-25 08:04

    【获奖名单】2025开发板评测大赛优秀开发者、最受欢迎开发板公布

    试用测评后通过问卷调查投票,选出了各自心目中最受欢迎的开发板。现将名单一同予以公示。 大赛作品详情:【作品精选】2025电子发烧友开发板测评大赛作品合集! 优秀作品开发者: 专题厂商试用板子用户
    发表于 11-21 09:31

    一图看懂绿电直连的四种玩法

    通过 “总览框架 + 分模式图解” 的形式,用可视化逻辑拆解绿电直连的四种核心模式,涵盖每种模式的核心特征、适用场景、参与主体三大关键信息,帮你快速区分不同 “玩法” 的差异与适配性。
    的头像 发表于 10-15 10:18 1596次阅读
    一图看懂绿电直连的<b class='flag-5'>四种</b>玩法

    [投票评选]2025电子发烧友开发板测评大赛--最受欢迎开发板

    2025电子发烧友开发板测评大赛--最受欢迎开发板 大赛详情: 电子发烧友携手 16 家生态厂商发起开发板测评大赛,设 OpenHarmony、RISC - V、Rockchip 三大赛道,共计
    发表于 10-13 16:25

    从入门到精通:基于开源代码的BLE四种模式开发详解

    Bluetooth Smart,是蓝牙4.0及更高版本引入的低功耗无线通信技术,专为低带宽、间歇性数据传输的物联网(IoT)和穿戴设备设计。   一、Air8000蓝牙大模式 Air8000蓝牙支持四种模式,分别是中心设备模式
    的头像 发表于 10-09 18:00 686次阅读
    从入门到精通:基于开源代码的BLE<b class='flag-5'>四种</b>模式开发详解

    SQL 通用数据类型

    SQL 通用数据类型 数据库表中的每个列都要求有名称和数据类型。Each column in a database table is required to have a name and a
    的头像 发表于 08-18 09:46 851次阅读

    SC、LC、FC和ST四种类型中哪类价格最贵

    在SC、LC、FC和ST四种类型的光纤跳线中,FC类型的光纤跳线通常价格相对较高,具体分析如下: FC类型的光纤跳线: 特点:采用金属螺纹套筒连接,具有较高的稳定性和抗拉强度,适用于高振动环境或需要
    的头像 发表于 07-25 10:16 1325次阅读

    最受欢迎的单板计算机 x 最流行的移动操作系统

    在本文中,我们将揭秘:应在树莓派上使用Android的4个理由从哪里获取树莓派的Android系统?该选择哪一个?未来展望。在树莓派上使用Android的4个理由树莓派无疑是世界上最受欢迎
    的头像 发表于 06-18 17:20 912次阅读
    <b class='flag-5'>最受欢迎</b>的单板计算机 x 最流行的移动操作系统

    RDMA简介3之四种子协议对比

    RDMA协议共有四种子协议,分别为InfiniBand、iWARP、RoCE v1和RoCE v2协议。这四种协议使用统一的RDMA API,但在具体的网络层级实现上有所不同,如图1所示,接下来将
    发表于 06-04 16:05

    IEC101协议可以传输什么类型数据

    IEC101协议作为电力系统远动通信的核心标准,其核心能力在于支持多种类型数据的传输,满足调度端与场站端(如变电站、发电厂)的实时监控、控制及状态感知需求。以下从数据类型、传输模式及典型应用场景三个
    的头像 发表于 05-21 11:37 1214次阅读