[Python] 深入理解列表和元组

在学习的C语言中有数组可以用来存储数据,那么在Python中是否也有这样的工具呢?接下来让可莉来给大家讲解列表和元组这两个强力工具吧~

                                     

                                        专栏:《Python》

                                        blog:Keven ’ s blog

在 Python 中,列表和元组是两种常用的序列数据类型,用于存储和操作一组数据。虽然它们的用

途相似,但它们在一些方面有很大的不同。在本篇博客中,可莉将跟着大家一起深入了解它们的特

点、用法和区别。

列表

在编程中,我们经常需要变量来保存数据,如果要保存的数据数量较少的话我们可以创建变量来进行保存,那如果数据很多呢?这时候就要引入列表的概念了。

创建列表

创建列表有两种方式:

alist = [ ] #第一种
alist = list() #第二种print(type(alist))

如果需要往里面设置初始值, 可以直接写在 [ ] 当中

alist = [1, 2, 3, 4]
print(alist)

与Java和C++不同,在列表中可以存储不同类型的数据

alist = [1, 'hello', True]
print(alist)

访问下标

我们可以用下标运算符[ ] 来访问列表中的任意元素。通常,我们把 [ ] 中填写的数字成为下标或者索引。

alist = [1, 2, 3, 4]
print(alist[2])

下标是从0开始的,也就是说0对应的是列表中第一个元素,1对应的第二个元素,以此类推,如果列表的大小是n个元素,那么最大的下标就是n - 1。

通过下标不仅能访问数据,也能修改数据:

alist = [1, 2, 3, 4]
alist[2] = 100
print(alist)

当访问元素时下标超出有效范围时,程序会抛出异常:

alist = [1, 2, 3, 4]
print(alist[100])

我们可以用len来得到列表的大小:

alist = [1, 2, 3, 4]
print(len(alist))

通过len得到列表大小后在之后的运用中会使操作更加方便。

在Python中一个与C++,Java不同的地方就是它的列表元素可以用负数下标来获取,具体对应元素如下图所示。

我们通过代码运行看下:

alist = [1, 2, 3, 4]
print(alist[3])
print(alist[-1])

运行结果:

                                     

切片操作

通过下标操作是一次取出里面第一个元素.通过切片, 则是一次取出一组连续的元素, 相当于得到一

个子列表。

  • 使用 [ : ] 的方式进行切片操作
alist = [1, 2, 3, 4]
print(alist[1:3])

                           

alist[1:3] 中的 1:3 表示的是 [1, 3) 这样的由下标构成的前闭后开区间.

也就是从下标为 1 的元素开始(2), 到下标为 3 的元素结束(4), 但是不包含下标为 3 的元素.

所以最终结果只有 2, 3 

  • 切片操作中可以省略前后边界(具体规则如下)
alist = [1, 2, 3, 4]
print(alist[1:]) # 省略后边界, 表示获取到列表末尾
print(alist[:-1]) # 省略前边界, 表示从列表开头获取
print(alist[:]) # 省略两个边界, 表示获取到整个列表.

                  

  • 切片操作还可以指定 "步长" , 也就是 "每访问一个元素后, 下标自增几步"
alist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(alist[::1])
print(alist[::2])
print(alist[::3])
print(alist[::5])

  • 切片操作指定的步长还可以是负数, 从后往前进行取元素. 表示 "每访问一个元素之后, 下标自减几步"
alist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(alist[::-1])
print(alist[::-2])
print(alist[::-3])
print(alist[::-5])

  • 如果切片中填写的数字越界了, 不会有负面效果. 只会尽可能的把满足条件的元素都取到

但如果两个界限都超出了范围的话就会取不到元素,但也没有报错:

alist = [1, 2, 3, 4]
print(alist[100:200])

                                     

遍历列表元素

下面将进行讲解如何进行遍历数列元素。

for循环

下面这个方法的for循环只适合对列表中的元素进行只读状态,不能改变列表中的元素:

alist = [1, 2, 3, 4]
for elem in alist:print(elem)

                        

而通过下标的方法来访问可以对列表中的元素进行访问并且修改和操作:

alist = [1, 2, 3, 4]
for i in range(0, len(alist)):print(alist[i])

这个与上面的打印效果效果相同,接下来再举例一个进行修改元素的例子:

alist = [1, 2, 3, 4]
for i in range(0, len(alist)):alist[i] = 0
print(alist)

                        

while循环

alist = [1, 2, 3, 4]
i = 0
while i < len(alist):print(alist[i])i += 1

通过添加 i 的增加来控制循环。

新增元素

append

我们可以用append的方法向列表后面增添一个元素:

alist = [1, 2, 3, 4]
alist.append('hello')
print(alist)

此处的append是搭配列表对象alist来使用的,而不是作为一个独立的函数,是一种搭配对象的函数。

insert

我们可以通过insert来对列表中任意位置进行增添元素:

a  = [1, 2, 3, 4]
a.insert(1, 'hello')
a.insert(100, 'hello')
print(a)

函数的第一个形参位置填写的是要访问的位置的下标,第二个位置是要添加的元素。如果要添加的位置超出了列表的范围,它还是会尽量的进行添加,则添加到了列表的最后位置。

查找元素

用 in 查找

a = [1, 2, 3, 4]
print(1 in a)
print(10 in a)
print(1 not in a)
print(10 not in a)

可以通过in来进行查找,当in加上not时相当于对in进行逻辑取反。当用in找到元素时就会返回True,否则为False,用not in则是逻辑相反。

                                 

用 index 查找

使用 index 方法, 查找元素在列表中的下标. 返回值是一个整数. 如果元素不存在, 则会抛出异常。

alist = [1, 2, 3, 4]
print(alist.index(2))
print(alist.index(10))

删除元素
 

pop

alist = [1, 2, 3, 4]
alist.pop(2)
print(alist)

可以用pop来删除元素,如果只是alist.pop的话删除的是列表的最后一个元素,如果在( )中填写下标的话,那么pop就会通过下标来删除对应下标的元素。

remove

alist = [1, 2, 3, 4]
alist.remove(2)
print(alist)

                    

通过在remove的( )中填写要删除的元素即可达到删除对应元素的效果。

连接列表

使用 + 拼接

此处的 + 结果会生成一个新的列表. 而不会影响到旧列表的内容。

alist = [1, 2, 3, 4]
blist = [5, 6, 7]
print(alist + blist)

     

extend

使用 extend 方法, 相当于把一个列表拼接到另一个列表的后面。a.extend(b) , 是把 b 中的内容拼接到 a 的末尾. 不会修改 b, 但是会修改 a

alist = [1, 2, 3, 4]
blist = [5, 6, 7]
alist.extend(blist)
print(alist)
print(blist)

    

元组

元组和列表相比,基本是一致的。

元组用()表示(或者tuple()):

atuple = ( )
atuple = tuple()

元组与列表最大的区别就是:元组不能修改里面的元素, 列表则可以修改里面的元素

因此, 像读操作,比如访问下标, 切片, 遍历, in, index, + 等, 元组也是一样支持的,但是, 像写操作,

比如修改元素, 新增元素, 删除元素, extend 等, 元组则不能支持。

元组在 Python 中很多时候是默认的集合类型. 例如, 当一个函数返回多个值的时候:

def getPoint():return 10, 20result = getPoint()
print(type(result))

可莉的总结

  • 列表和元组都是日常开发最常用到的类型. 最核心的操作就是根据 [ ] 来按下标操作.
  • 在需要表示一个 "序列" 的场景下, 就可以考虑使用列表和元组.
  • 如果元素不需要改变, 则优先考虑元组.
  • 如果元素需要改变, 则优先考虑列表.

希望大家通过和可莉一起学习这篇博客能可以你更好地理解列表和元组,并选择适当的数据类型来处理你的数据,加油~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统基础(三):虚拟机与Linux系统安装

文章目录 虚拟机与Linux系统安装 一、系统的安装方式 二、虚拟机概念 三、虚拟机的安装 四、Linux系统安装 1、解压人工智能虚拟机 2、找到解压目录中的node1.vmx 3、启动操作系统 虚拟机与Linux系统安装 一、系统的安装方式 Linux操作系统也有两种安装方式&#xf…

【Linux系统学习】3.Linux用户和权限

Linux用户和权限 1.认知root用户 1.1 root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;超级管理员&#xff09; 而在前期&#…

代码随想录 Leetcode55. 跳跃游戏

题目&#xff1a; 代码(首刷自解 2024年2月9日&#xff09;&#xff1a; class Solution { public:bool canJump(vector<int>& nums) {int noz 0;for (int i nums.size() - 2; i > 0; --i) {if (nums[i] 0) {noz;continue;} else {if (nums[i] > noz) noz …

基于LightGBM的回归任务案例

在本文中&#xff0c;我们将学习先进的机器学习模型之一&#xff1a;Lightgbm。在对XGB模型进行了越来越多的改进以获得更好的性能之后&#xff0c;XGBoost是一种极限梯度提升机器&#xff0c;但通过lightgbm&#xff0c;我们可以在没有太多计算的情况下实现类似或更好的结果&a…

vscode debug无法直接查看eigen变量的问题(解决方法)

主要是给gdb添加一个Eigen相关的printer即可, 网上其他教程都搞太复杂了, 我整理成了一个仓库, 把仓库克隆下来直接运行 ./setup.sh脚本即可配置好 git clone gitgithub.com:fandesfyf/EigenGdb.git cd EigenGdb ./setup.sh 然后在vscode中重新debug即可。 效果 …

使用Arcgis裁剪

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、掩膜提取二、随意裁剪三、裁剪 前言 因为从网站下载的是全球气候数据&#xff0c;而我们需要截取成中国部分&#xff0c;需要用到Arcgis的裁剪工具 一、掩…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Slider组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Slider组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Slider组件 滑动条组件&#xff0c;通常用于快速调节设置值&#xff0c;如音量调…

响应式编程详解(持续更新)

响应式编程 1.多维度看全景1.1响应式编程(Reactive Programming )1.2函数式编程&#xff08;Functional Programming, 简称FP&#xff09;1.3技术演进1.4Rx是什么1.5[响应式宣言](https://www.reactivemanifesto.org/zh-CN) 2.钻进去看本质2.1名称解释(rajava)2.2观察者模式2.3…

注解(Java用于工具处理的标注)

一. 使用注解 1. 含义 注解是放在类&#xff0c;方法&#xff0c;字段&#xff0c;参数前的一种特殊“注释”&#xff0c;是一种用作标注的“元数据”。 2. 三类注解 1&#xff09;由编译器使用的注解&#xff0c;不会编译进.class文件&#xff0c;编译后扔掉&#xff1b;如&…

MPLS VPN功能组件(4)

数据转发过程 VPN数据的转发 顶层公网标签 由LDP分配&#xff0c;指示LSR如何将标签报文从始发的源PE通过LSP标签交换到达目的PE 内层私网标签(VPN标签) 由MP-BGP分配&#xff0c;在将每一条客户路由变为VPNv4路由前缀时会自动为每一条VPNv4前缀关联一个标签 内层私网标签用于…

正版软件 - Proxyman:让网络调试变得更智能、更高效

在软件开发的世界里&#xff0c;网络调试一直是开发者和测试工程师的痛点。传统的调试工具往往操作复杂&#xff0c;界面不够直观&#xff0c;而且性能上也难以满足现代应用的需求。今天&#xff0c;我要向大家介绍一款名为Proxyman的网络调试工具&#xff0c;它以其简洁的界面…

springboot微信小程序 uniapp学习资料分享系统v9uy4

理论意义 当今网络教学已成为各国教育改革 和发展的趋势。因此&#xff0c;构建一个适合交互式课堂教学模式的教学平台就成了当务之 急。 在国内高校&#xff0c;目前交互平台主要用于网络学院的远程教学&#xff0c;至于校园内的正规教学&#xff0c;老师自发建立课程主页的比…

【学网攻】 第(24)节 -- 帧中继(点对点)

系列文章目录 目录 系列文章目录 文章目录 前言 一、帧中继是什么&#xff1f; 二、实验 1.引入 实验拓扑图 实验配置 在帧中继中配置通信链路​编辑 实验验证 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 --…

【Linux网络编程三】Udp套接字编程网络应用场景

【Linux网络编程三】Udp套接字编程网络应用场景 应用场景一&#xff1a;远程命令执行应用场景二&#xff1a;与Windos端相互通信应用场景三&#xff1a;简单聊天1.多线程化2.输入输出分开 应用场景一&#xff1a;远程命令执行 简单的服务器上一篇已经完成&#xff0c;接下来我…

【AIGC核心技术剖析】AI生成音乐:MAGNeT一种直接操作多个音频令牌流的掩码生成序列建模方法

MAGNeT是一种直接操作多个音频令牌流的掩码生成序列建模方法。与先前的工作不同&#xff0c;MAGNeT由一个单阶段、非自回归的变压器组成。在训练期间&#xff0c;论文使用掩码调度器预测从掩码令牌中获得的跨度&#xff0c;而在推断期间&#xff0c;论文通过多个解码步骤逐渐构…

MySQL管理的常用工具(mysqldump备份工具,mysqlimport/source导入工具)

mysqldump mysqldump 客户端工具用来备份数据库或在不同数据库之间进行数据迁移。备份内容包含创建表&#xff0c;及 插入表的SQL语句。 语法 &#xff1a; mysqldump [options] db_name [tables] mysqldump [options] --database/-B db1 [db2 db3...] mysqldump [options] -…

宋小黑原创高清壁纸分享之蓝白云海

大家好&#xff0c;我是小黑&#xff0c;最近迷上了制作壁纸&#xff0c;哈哈&#xff0c;给大家分享一波&#xff0c;小黑做的美图~ 本期给大家分享的是&#xff0c;小黑原创的蓝白云海主题系统壁纸~ 厌倦了一成不变的壁纸吗&#xff1f; 感到学习负担过重吗&#xff1f; …

python烟花绘制,春节祝福

春节将至&#xff0c;写一个烟花程序给亲近的人 核心逻辑 烟花类&#xff1a; 定义烟花的颜色&#xff0c;更新烟花的轨迹&#xff0c;爆炸&#xff0c;消失等功能&#xff0c;在烟花爆炸的同时也涉及到粒子的创建 class Firework:def __init__(self):# 随机颜色self.colou…

数据结构——单向链表和双向链表的实现(C语言版)

目录 前言 1. 链表 1.1 链表的概念及结构 1.2 链表的分类 2. 单链表接口实现 2.1 数据结构设计与接口函数声明 2.2 创建结点&#xff0c;打印&#xff0c;查找 2.3 尾插&#xff0c;头插&#xff0c;尾删&#xff0c;头删 2.4 插入或删除 2.4.1在指定位置后 2.4.2在…

制作二维码扫描器

目录 前言原料主要的库资源其它 制作准备工作界面功能封装扫描二维码扫描复制扫描结果 成果 打包结尾下载链接 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&am…