社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python中的数据结构

小白学视觉 • 4 年前 • 277 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:磐创AI

概述
  • 在深入研究数据科学和模型构建之前,Python中的数据结构是一个需要学习的关键概念

  • 了解Python提供的不同数据结构,包括列表、元组等

介绍

数据结构听起来是一个非常直截了当的话题,但许多数据科学和分析的新手并不知道它是什么。当我询问这些人关于Python中不同的数据结构以及它们是如何工作的时,他们一片空白。

Python是一种很容易学习的编程语言,但是我们需要先弄清楚我们的基本知识,然后再深入研究有吸引力的机器学习。这是因为在我们执行的每一个数据探索任务背后,甚至在我们采取的分析步骤背后,都有一个数据存储和组织的基本元素。

而且这是一个无需考虑的问题——当我们高效地存储数据时,提取信息变得非常容易。由于我们的代码运行得更快,我们节省了大量的时间——谁不希望这样呢?

所以我希望你掌握Python中的数据结构。

在本文中,我们将探讨Python中的基本内置数据结构,当你在现实世界中处理数据时,这些结构将非常有用。所以无论你是数据科学家还是分析师,这篇文章对你来说都同样重要。

目录
  • Python中的数据结构

  • 数据结构1:Python中的列表

    • 创建列表
    • 访问列表元素
    • 在列表中追加值
    • 从列表中删除元素
    • 排序列表
    • 串联列表
    • 列表解析
    • 使用列表堆栈和队列
  • 数据结构2:Python中的元组

    • 在Python中创建元组
    • 元组的不变性
    • 元组赋值
    • 更改元组值
  • 数据结构3:Python中的字典

    • 生成字典
    • 访问键和值
  • 数据结构4:Python中的集合

    • 从集合中添加和删除元素
    • 集合的操作
Python中的数据结构

「数据结构」是高效存储和组织数据的一种方法。这将允许你轻松访问和执行数据操作。

在数据结构方面,没有一种适合所有类型的模型。你将需要以不同的方式存储数据,以满足一时需要。也许你想把所有类型的数据存储在一起,或者你想要一些更快的数据搜索,或者一些只存储不同数据项的东西。

幸运的是,Python有许多内置的数据结构,可以帮助我们轻松地组织数据。因此,有必要先了解这些,以便我们在处理数据时,确切地知道哪些数据结构将有效地解决我们的目的。

数据结构1:Python中的列表

Python中的列表是最通用的数据结构。它们用于存储异构数据项,从整数到字符串,甚至是另一个列表!它们也是可变的,这意味着即使在创建列表之后,它们的元素也可以更改。

创建列表

列表是通过将元素括在[]内创建的,每个项用逗号分隔:

由于列表中的每个元素都有自己不同的位置,因此在列表中具有重复的值不是问题:

访问列表元素

要访问列表的元素,我们使用索引。列表中的每个元素都有一个与其相关的索引,这取决于它在列表中的位置。列表的第一个元素有索引0,下一个元素有索引1,依此类推。列表的最后一个元素的索引小于列表的长度。

但索引不一定总是正的,也可能是负的。你认为负索引意味着什么?

正索引从列表开始开始计数,而负索引从列表末尾开始计数。如果我们想从列表的末尾返回第n个元素,这就避免了我们必须执行的琐碎计算。因此,对于列表的最后一项,我们不需要返回List_name[len(List_name)-1] 元素,只需编写List_name[-1]

使用负索引,我们可以轻松地返回列表末尾的第n个元素。如果我们想从结尾返回第一个元素,或者最后一个索引,那么关联的索引是-1。类似地,倒数第二个元素的索引将是-2,依此类推。记住,第0个索引仍然引用列表中的第一个元素。

但是如果我们想返回列表中两个位置之间的一系列元素呢?这叫做切片。我们要做的就是指定开始和结束索引,例如List_name[start : end]

这里要记住的一件重要的事情是,结束索引处的元素永远不包含在内。只返回从开start索引到等于end-1索引的元素。

在列表中追加值

我们可以使用**append()**或 「insert()」 方法向现有列表中添加新元素:

  • 「append()」,在列表末尾添加一个元素
  • 「insert()」,在指定的特定位置将元素添加到列表

从列表中删除元素

从列表中删除元素与添加元素一样简单,可以使用**remove()「或」pop()**方法完成:

  • 「remove()」–从列表中删除与给定值匹配的第一个匹配项
  • 「pop()」–当我们要从列表中移除指定索引处的元素时使用。但是,如果我们不提供索引值,最后一个元素将从列表中删除

排序列表

大多数情况下,你将使用列表对元素进行排序。因此了解**sort()**方法非常重要。它允许你按升序或降序对列表元素进行就地排序:

但是当你想要对包含字符串元素的列表进行排序时,事情就变得有点棘手了。你如何比较两个字符串?好吧,字符串值是使用字符串中字符的ASCII值排序的。字符串中的每个字符都有一个与其关联的整数值。我们使用这些值对字符串进行排序。

在比较两个字符串时,我们只是从一开始比较每个字符的整数值。如果在两个字符串中遇到相同的字符,我们只需比较下一个字符,直到找到两个不同的字符。当然,这是内部完成的,所以你不必担心!

合并列表

我们甚至可以通过简单地使用+符号连接两个或多个列表。这将返回一个新列表,其中包含两个列表中的元素:

列表解析

列表的一个非常有趣的应用是列表解析,它提供了一种创建新列表的简洁方法。这些新列表是通过对现有列表的每个元素应用操作创建的。如果我们首先检查一下如何使用旧的for循环来完成它:

现在,我们将看到如何使用列表理解简洁地执行此操作:

看到区别了吗?列表解析对于任何数据科学家来说都是一项有用的语法,因为你可以看到和编写简明易读的代码!

堆栈和队列

列表是Python中内置的数据结构。但我们可以使用它来创建用户定义的数据结构。使用列表构建的两种非常流行的用户定义数据结构是栈和队列。

栈是一个元素列表,其中元素的添加或删除是从列表的末尾开始的。把它想象成一堆书。当你需要从书堆中添加或删除一本书时,你可以从顶部开始。它使用了后进先出的简单概念。

另一方面,队列是一个元素列表,其中元素的添加发生在列表的末尾,而元素的删除则发生在列表的前面。你可以把它想象成现实世界中的一个队列。当前面的人离开队列时,队列变短。当有新成员从末尾添加到队列中时,队列将变长。它使用先进先出的概念。

现在,作为一个数据科学家或分析师,你可能不是每天都在使用这个概念,但是当你必须构建自己的算法时,它肯定会帮助你!

数据结构2:Python中的元组

元组是Python中另一种非常流行的内置数据结构。它们与列表非常相似,只不过有一个区别,它们是不可变的。这意味着一旦生成元组,就不能添加、删除或编辑任何值。

我们将进一步探讨这个问题,但首先让我们看看如何在Python中创建元组!

在Python中创建元组

元组可以通过在(括号)内写入值来生成,每个元素用逗号分隔。但是,即使你写了一堆没有任何括号的值并把它们赋给一个变量,你最终还是会得到一个元组!

好了,现在我们知道了如何创建元组,让我们讨论一下不变性。

元组的不变性

在Python中,任何在创建后不能修改的内容都是不可变的。Python语言可以分解为可变和不可变的对象。

列表、字典、集合(我们将在后面的章节中探讨这些)是可变对象,这意味着它们可以在创建后修改。另一方面,整数、浮点数、布尔值、字符串甚至元组都是不可变的对象。但是,是什么使它们不可改变呢?

Python中的所有内容都是一个对象。所以我们可以使用内置的**id()**方法来检查对象的内存位置。这被称为对象的标识。让我们创建一个列表并确定列表及其元素的位置:

如你所见,列表及其元素在内存中都有不同的位置。因为我们知道列表是可变的,所以我们可以改变其元素的值。让我们这样做,看看它如何影响:

列表的位置没有改变,但元素的位置改变了。这意味着为元素创建了一个新对象并保存在列表中。这就是可变的意思。可变对象可以在创建后更改其状态或内容,但不可变对象不能这样做。

但是我们可以调用元组伪不可变,因为即使它们是不可变的,它们也可以包含其值可以修改的可变对象!

从上面的示例中可以看到,我们能够更改元组中包含的不可变对象list的值。

元组赋值

元组打包和解包是一些有用的操作,你可以执行这些操作来将值赋给单行中另一个元组。

当我们制造元组时,我们已经看到了元组的打包。元组解包与打包相反。

它对于在一行中交换值非常有用。老实说,这是让我对Python感到兴奋的第一件事,能够用这么少的代码做这么多事情!

更改元组值

虽然我说过元组值不能更改,但实际上可以通过使用list()将其转换为列表来对其进行更改。完成更改后,可以再次使用tuple()将其转换回元组。

然而,这种更改非常昂贵,因为它需要复制元组。但是,当你不希望其他人更改数据结构的内容时,元组就派上了用场。

数据结构3:Python中的字典

Dictionary是另一种Python数据结构,用于存储不可变但无序的异构对象。这意味着当你试图访问这些元素时,它们的顺序可能与你插入它们的顺序不完全相同。

但是,使词典与列表区别开来的是元素在其中的存储方式。字典中的元素是通过它们的键值而不是它们的索引来访问的,正如我们在列表中所做的那样。所以字典包含键值对,而不仅仅是单个元素。

生成词典

字典是通过{}括号内写入键和值生成的。每个键值对用逗号分隔:

使用键,我们可以轻松提取关联值:

这些键是独一无二的。但是,即使字典中有多个项具有相同的键,项的值为最后一个键关联的值:

字典对于快速访问项非常有用,因为与列表和元组不同,字典不必遍历所有找到值的项。字典使用哈希提高性能。

访问键和值

你可以使用 「keys()」 方法从字典访问键,使用**values()「方法访问值。我们可以使用for循环查看它们,也可以使用」list()**将它们转换为列表:

我们甚至可以使用**items()**方法同时访问这些值,该方法返回字典中每个元素的相应键值对。

数据结构4:Python中的集合

有时不希望在列表或元组中多次出现同一个元素。在这里,你可以使用「集合」数据结构。Set是一个无序但可变的元素集合,它只包含唯一的值。

你将看到这些值的顺序与在集合中输入的顺序不同。这是因为集合是无序的。

从集合中添加和移除元素

要向集合中添加值,请使用**add()**方法。它允许你添加除可变对象以外的任何值:

要从集合中移除值,有两个选项可供选择:

  • 第一个是**remove()**方法,如果元素不在集合中,它会给出一个错误

  • 第二个是「discard()」 方法,它删除元素,但当元素不在集合中时不会出错

如果该值不存在,「remove()「将给出一个错误,而」discard()」 则不会。

集合操作

使用Python集,你可以执行两个集之间的并集、交集和差集等操作,就像在数学中一样。

两个集合的并集给出两个集合的值。但这些值是独一无二的。因此,如果两个集合包含相同的值,则只返回一个副本:

两个集合的交集只返回两个集合共有的值:

一个集合与另一个集合的差集只给出第一个集合中不存在的值:

结尾

Python是一种漂亮的语言。它为你提供了许多选项来更有效地处理数据。学习Python中的数据结构是你学习过程中的一个关键。

原文链接:https://www.analyticsvidhya.com/blog/2020/06/data-structures-python/

下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/116059
 
277 次点击