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 的功能,可以查看官方文档。

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

    关注

    66

    文章

    8092

    浏览量

    130510
  • python
    +关注

    关注

    51

    文章

    4667

    浏览量

    83436

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

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

收藏 人收藏

    评论

    相关推荐

    plc数据类型怎么理解和应用

    PLC(可编程逻辑控制器)是一种工业自动化设备,用于控制机械和工业过程。在PLC编程中,数据类型是非常重要的概念,因为它决定了程序中数据的存储和处理方式。正确理解和应用PLC数据类型是编写有效、可靠
    的头像 发表于 12-19 11:39 1255次阅读

    oracle的数据类型有哪些

    Oracle数据库中有许多数据类型可供选择,每种数据类型都有其各自的特点和适用场景。下面是对Oracle数据库中最常用的数据类型的详尽说明,
    的头像 发表于 12-05 16:45 581次阅读

    redis的五种数据类型底层数据结构

    Redis是一种内存数据存储系统,支持多种数据结构。这些数据结构不仅可以满足常见的存储需求,还能够通过其底层数据结构提供高效的操作和查询。以下是Redis中常用的五
    的头像 发表于 11-16 11:18 357次阅读

    redis的五种数据类型

    Redis是一种高性能的内存数据库,常用于缓存、任务队列、分布式锁等场景。它提供了多种数据类型来满足各种不同的需求,包括字符串(string)、哈希(hash)、列表(list)、集合(set
    的头像 发表于 11-16 11:06 332次阅读

    collections:一款强大的内置容器

    、tuple)的一个替代。 最初collections模块类型众多,在python3.3版本中将一部分抽象数据类型写进了
    的头像 发表于 11-01 11:38 6385次阅读
    <b class='flag-5'>collections</b>:一款强大的内置容器

    Redis数据类型介绍

    支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)。 string(字符串) 字符串类型是Redis的最基本数据结构。 字符串
    的头像 发表于 10-09 10:53 518次阅读
    Redis<b class='flag-5'>数据类型</b>介绍

    Redis的数据类型有哪些

    用的一种数据类型,普通的key- value 存储都可以归为此类。其中Value既可以是数字也可以是字符串。使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。 2、Hash:Hash 是一个键值(
    的头像 发表于 10-09 10:51 385次阅读

    FreeRTOS使用的数据类型有哪些

    数据类型 FreeRTOS 使用的数据类型主要分为 stdint.h 文件中定义的和自己定义的。其中 char 和 char * 定义的变量要特别注意。 FreeRTOS 主要自定义了以下四种数据类型
    的头像 发表于 09-28 11:49 403次阅读

    PostgreSQL中可用的各种数据类型

    PostgreSQL是一种功能强大的开源关系型数据库管理系统,具有广泛的数据类型支持。在本教程中,我们将介绍PostgreSQL中可用的各种数据类型,包括数值、字符串、几何、时间、日期、布尔、货币
    的头像 发表于 09-19 14:08 997次阅读

    PLC 数据类型 (UDT) 的基本知识

    说明 PLC 数据类型 (UDT) 是一种复杂的用户自定义数据类型,用于声明一个变量。这种数据类型是一个由多个不同数据类型元素组成的数据结构
    的头像 发表于 09-10 09:46 2098次阅读
    PLC <b class='flag-5'>数据类型</b> (UDT) 的基本知识

    2023年受欢迎8款编程语言排名:Python 第二

    根据DevJobsScanner发布的报告,2023年度(从2022年1月到2023年5月)需求量最大的编程语言数据显示,JavaScript、Python和Java仍然是职场上备受欢迎的编程语言。
    的头像 发表于 07-28 17:57 4519次阅读

    ARRAY 数据类型的变量

    要求 全局数据块已打开。 操作步骤 要声明一个 ARRAY 数据类型的变量,请按以下步骤操作: 在“名称”(Name) 列中,输入变量的名称。 在“数据类型”列中输入“Array”数据类型
    的头像 发表于 07-06 11:08 640次阅读

    python变量与基本数据类型介绍

    1、前言 熟练掌握一门编程语言,最好的方法就是充分了解,掌握基础知识,并亲自体验,多敲代码,熟能生巧。本文首先介绍python基础知识的保留字与标识符,然后将介绍在python中如何使用变量以及各种数据类型
    的头像 发表于 07-05 15:51 535次阅读

    GaussDB 数据类型介绍

    GaussDB 数据库 GaussDB 是华为基于 openGauss 自研生态推出的云化企业级分布式关系型数据库,它支持多种数据类型,包括数值、字符、日期等。在使用 GaussDB 时,可能需要
    的头像 发表于 06-05 16:40 1258次阅读
    GaussDB <b class='flag-5'>数据类型</b>介绍

    Verilog最常用的2种数据类型

    Verilog 最常用的 2 种数据类型就是线网(wire)与寄存器(reg),其余类型可以理解为这两种数据类型的扩展或辅助。
    的头像 发表于 05-29 16:27 1173次阅读
    Verilog最常用的2<b class='flag-5'>种数据类型</b>