Python 基础语法 二维列表

news2024/11/14 0:02:18

目录

    • 1. 序幕
    • 2. 前期回顾
    • 3. 创建一个二维列表
    • 4. 二维列表的宏观层面
      • 4.1. 二维列表的值
      • 4.2. 二维列表的数据类型
      • 4.3. 二维列表的长度
    • 5. 二维列表的微观层面
      • 5.1. 二维列表元素的值
      • 5.2. 二维列表元素的数据类型
      • 5.3. 二维列表元素的索引
    • 6. 二维列表的遍历
      • 6.1. 单层循环遍历
      • 6.2. 双层循环遍历
    • 7. 练习题

1. 序幕

上一次给大家分享了关于一维列表的一些有趣的东西,今天要为大家带来的是二维列表,一维列表的plus版!
在开始介绍我们的新玩具之前,我们先回顾一下一维列表的一些知识吧~

2. 前期回顾

对一维列表的解剖学考究,分为两个层面——宏观层面和微观层面,或者说整体层面和局部层面。从宏观层面上来看,我们关心三个点:数据类型长度
一维列表的简称是列表,全称是一维列表类型变量。在实践上常常以这样的形式出现:

nums = [20, 24, 11, 8, 20, 52]

nums首先本质上是一个变量,那么关于变量我们会关心这么两个方面:一、变量的数据类型是什么?二、变量的值是什么?
变量的数据类型,我们有一个工具可以用来操作,那就是type()函数;而关于变量的值,我们常常使用print()函数输出在控制台上以查看它。而nums这个变量呢,它不是旁的什么,它是列表(类型的变量)。那么继而我们引发出更深的兴趣点——它有几个元素,即它的长度是多少?对此,我们可以使用len()函数来获取列表的长度。

# 列表(列表型变量)的宏观操作
print(nums)  # 输出变量的值
print(type(nums))  # 输出变量的数据类型
print(len(nums))  # 输出列表的长度

说完宏观层面,我们再来说说微观层面。因为列表是由元素组成的,所以微观层面我们关注的就是元素。元素呢,也有三方面的考量:一、元素的值是什么?二、元素的索引是多少?三、元素的数据类型是什么?

print(nums[0])  # 输出第1个元素的值
print(nums.index(20))  # 输出值为20的元素的索引
print(type(nums[0]))  # 输出第1个元素的数据类型
  • 列表
    • 宏观层面
      • 数据类型
      • 列表长度
    • 微观层面
      • 元素的值
      • 元素的索引
      • 元素的数据类型

3. 创建一个二维列表

废话不多说,直奔我们今天的主题吧——二维列表。
二维列表在数学上,或者数据分析与机器学习领域,又称为矩阵向量组。上一次我们讲一维列表时,提到一维列表也叫做向量Tips:在理解一维列表与二维列表的关系时,用向量-向量组这个视角会非常方便。
在创建一个二维列表变量时,我们一般习惯上使用下面这样的形式:

nums = [
	[20, 24, 11, 8, 20, 52],
	[20, 24, 11, 8, 22, 28],
	[50, 47, 10, 14, 11, 4],
]

这种形式的目的在于,凸显其二维的特点!当然我们也可以写成一行,但是不建议这么做。

nums = [[20, 24, 11, 8, 20, 52], [20, 24, 11, 8, 22, 28], [50, 47, 10, 14, 11, 4]]

不知道,聪明的你是否留意到,写成一行后,有一个细微的差别。那就是最后一个元素后面没有逗号了。其实两种写法,最后一个元素后面都可以有或者没有。那为什么要有这种区别呢?答案很简单,为了美观😄

4. 二维列表的宏观层面

4.1. 二维列表的值

二维列表首先也是一个变量,那么同样的我们也先从宏观层次来考量一下它的三个方面吧——值、类型、长度。

print(nums)  # 输出变量nums的值

你将会在控制台上获得如下内容:

[[20, 24, 11, 8, 20, 52], [20, 24, 11, 8, 22, 28], [50, 47, 10, 14, 11, 4]]

ps:无论你使用哪种形式创建一个二维列表,都将获得以上内容。
看完了变量nums的值,接下来,我们再看看变量nums的类型吧。

4.2. 二维列表的数据类型

print(type(nums))  # 输出变量nums的数据类型

结果是:

<class 'list'>

意思是,“数据类型是列表”。看到这里,好奇的你不知道是否会感到狐疑——“一维列表是列表,二维列表也是列表,敢情都是列表,还分啥一维列表、二维列表呢?一维列表和二维列表的区别是什么呢?”答案是,区别在值上。
最后,我们看看宏观维度上,在长度这个方面,二维列表又会有怎样的表现呢?

4.3. 二维列表的长度

print(len(nums))  # 获取列表nums的长度

接下来发生的事情,可能会更让你大惊失色。实验运行结果出来了,控制台上赫然输出了一行“大字”——

3

“什么?一个二维列表欸,写了那么多字才创建好的一个二维列表诶!咋长度才为3啊?这还没有,一开始创建的那个一维列表的长度长呢?”那么,问题来了,为什么会这样呢?首先让我们回顾一下,“列表长度”的定义——“列表中元素的个数”。而列表由元素组成,元素之间由逗号隔开。好的,现在重新审视一下我们的二维列表nums,你看看,哪里会与3有关呢?

nums = [
	[20, 24, 11, 8, 20, 52],
	[20, 24, 11, 8, 22, 28],
	[50, 47, 10, 14, 11, 4],
]

显然,这里有3行一维列表。没错!这3行一维列表就是我们二维列表nums中的元素,一共有3个元素。刚开始提到的一维列表nums = [20, 24, 11, 8, 20, 52]中,每个元素都是整数int型。而现在这个二维列表中的元素呢,每个都是列表list型。仅此而已。列表中套列表,我们就称它为二维列表。而这里,类比于数学上的向量-向量组,就很好理解了。[20, 24, 11, 8, 20, 52],[20, 24, 11, 8, 22, 28],[50, 47, 10, 14, 11, 4]三个行向量,组成了一个向量组。考虑到,这次聊的是基础语法,面对的朋友呢,可能大多数是没有学过线性代数的,就不过多提及了。感兴趣的朋友可以自己探索,悄悄给你透露一下,线性代数对于机器学习至关重要!

5. 二维列表的微观层面

5.1. 二维列表元素的值

言归正传,二维列表也是列表,只是每一个元素都是一维列表罢了。那么对于一维列表行之有效的方法,对于现在的二维列表也依然有效。比如使用下标访问法,获取元素的值。

print(nums[0])  # 获取第一个元素的值

控制台上的结果为:

[20, 24, 11, 8, 20, 52]

不知道,看到这样的结果,你会有什么想法?nums[0]是一个列表……
这有一个一维列表num,你还记得怎么访问它的第一个元素吗?

num = [20, 24, 11, 8, 20, 52]

对的。

print(num[0])

那么现在告诉你,nums[0]是个一维列表,我们把它赋值给num。我们该如何访问列表型变量num的第一个元素呢,答案还是num[0]

num = nums[0]
print(num[0])

我颠来倒去,一点一点地往前推理,不知道你是否产生了一个大胆的想法。那就是——

print(nums[0][0])

是的!没错!我们可以直接使用nums[0][0],来访问二维列表nums中第一个元素[20, 24, 11, 8, 20, 52]中的第一个元素20。用二维列表相应的专门术语来说,称之为访问二维列表中第一行第一列元素
方才,我们探索出了,使用下标访问法访问二维列表某行某列的元素(其实这个讲法不太好,这是用数学里矩阵的概念来理解的,后面的操作会让你发现这个讲法有点和其他概念不融洽,不过没关系,我们暂且遵守传统的表述习惯)。以上是关于,元素的值的操作。那么接下来我们研究一下对于元素的类型的操作。

5.2. 二维列表元素的数据类型

print(type(nums[0]))  # 获取第一个元素的数据类型

运行结果是:

<class 'list'>

对于这个结果,我们不意外,之前分析元素的值的时候,我们已经单凭肉眼就可以一眼判断出数据类型了。🆗,就像前面访问元素的值一样,我们也可以获取某行某列某个元素的数据类型。

print(type(nums[0][0]))  # 获取第一个行向量中的第一个元素的数据类型

ps:注意我的注释,这里使用的是向量组的相关概念。使用向量-向量组的概念来梳理二维列表可以解决前面提到的理论体系不融洽的问题。另外,由于二维列表的构成方式,只能由行向量组成,所以其实这里“行向量”可以简写为“向量”。
本次样例的运行结果是:

<class 'int'>

还记得微观层面的三个部分是哪些吗?我们眼下还差哪部分没提到呢?对了,index()!

5.3. 二维列表元素的索引

在一维列表nums中,index()的用法及运行效果是这样的:

nums = [20, 24, 11, 8, 20, 52]
print(nums.index(20))

结果为:

0

那直接照搬这个用法,到二维列表呢?

nums = [
	[20, 24, 11, 8, 20, 52],
	[20, 24, 11, 8, 22, 28],
	[50, 47, 10, 14, 11, 4],
]
print(nums.index(20))

你会得到一个报错ValueError,值错误。错误详情是,“20不在列表中”。

ValueError                                Traceback (most recent call last)
Cell In[9], line 1
----> 1 print(nums.index(20))

ValueError: 20 is not in list

来,问你哈。你觉得“20”在不在二维列表nums中?怎么不在?肉眼可见的在呀!“20”不光在二维列表中,而且有三个“20”呢!
那,这样子就大错特错了。前面分析过,二维列表nums的数据类型为list,列表的长度为3,其中每一个元素都是list型的。“20”不在二维列表中,准确来讲是,“20”作为元素的值不在二维列表中。“20”是作为二维列表元素的元素的值存在的。类比于欧洲中世纪封建等级制度就是——“附庸的附庸,不是我的附庸——二维列表元素的元素,不是二维列表的元素。虽然听起来很拗口,但是用代码表达起来很简单,你照下面这样写就可以得到一个正常输出:

print(nums[0].index(20))

它将输出,“20”在列表[20, 24, 11, 8, 20, 52]中第一次出现的位置。

6. 二维列表的遍历

走过千山万水,经历过种种考验,总算来到这第九九八十一难——遍历!什么是遍历呢?遍历就是,按照一定的次序,依次访问数据中所有的内容。对于一维列表,我们一般按照从左往右的阅读顺序访问列表的元素。而对于二维列表,我们一般按照从上往下、从左往右的顺序遍历。ps:当然你也可以说是按照从左往右的顺序😉(创建二维列表时,第二种写法,揭露了二维列表在计算机内存上存储的本质形式——线性)。

6.1. 单层循环遍历

二维列表也是列表,我们完全可以像一维列表一样,使用一层循环即可遍历二维列表中的元素(每个元素都是列表)。在一维列表中,我们详细介绍了四种遍历写法,这里就不再赘述了。仅以for循环为例,写在下面:

# 下标访问法遍历二维列表
for i in range(len(nums)):
	print(nums[i])

运行结果为:

[20, 24, 11, 8, 20, 52]
[20, 24, 11, 8, 22, 28]
[50, 47, 10, 14, 11, 4]

使用迭代器遍历法会更加简洁一些,我们可以优化如下:

for num in nums:
	print(num)

6.2. 双层循环遍历

一维列表到上面的遍历就结束了,但是看到遍历的结果,程序员们似乎不太满足。(我想大概是受到古老的C语言的影响——C语言不支持直接输出一行“列表”,或者用C语言的讲法“一行数组”。)好吧,既然打开二维列表之后,里面还有一层列表,就像俄罗斯套娃一样。那么让我们不胜其烦地再进行一层循环吧~

# 双层for循环遍历二维列表,下标访问法
for i in range(len(nums)):
	for j in range(len(nums[i])):
		print(nums[i][j])
# 双层for循环遍历二维列表,迭代器法
for num in nums:
	for n in num:
		print(n)

whie循环的套娃式写法我就不再提了,另外你不光可以写纯for的双层循环,或者纯while的双层循环,你还可以写又for又while的双层循环。外层有4种循环写法,内层也有4种循环写法,根据乘法原理,一共可以得到 4 × 4 = 16 4\times4=16 4×4=16种写法。
我们把目光就放到双层for循环上,我们先看看上面的代码段运行的效果吧。两段代码的运行效果都一样:

20
24
11
8
20
52
20
24
11
8
22
28
50
47
10
14
11
4

这个形式,检查起来,也太……麻烦了吧😅咱们能不能让它可以一眼就看得过来呢?目前是由于行数太多了,得往下翻翻才能看完。那我们能不能让它输出的行数变少呢?分析一下代码,我们发现我们使用的是print(nums[i][j])print()函数没有设置end参数的值,默认是\n换行(print(n)同理)。那么我们可以这样改造一下:

# 双层for循环遍历二维列表,下标访问法
for i in range(len(nums)):
	for j in range(len(nums[i])):
		print(nums[i][j], end=' ')

这次是没有很多行了……

20 24 11 8 20 52 20 24 11 8 22 28 50 47 10 14 11 4

直接变成一行输出了。分不清是从一维列表里遍历出的结果,还是从二维列表里遍历出的结果,并且如果数据量再大点,不用竖着翻了,还是得横着翻的。那么能不能有种办法,既可以少输出几行,又能体现出二维列表的特征呢?诶~~~方法是有滴!方法总比问题多,“提出你的需求,编程总可以满足你”!

# 双层for循环遍历二维列表,下标访问法
for i in range(len(nums)):
	for j in range(len(nums[i])):
		print(nums[i][j], end=' ')
	print()

这一次的结果是这样的:

20 24 11 8 20 52 
20 24 11 8 22 28 
50 47 10 14 11 4 

怎么样?是不是很完美!古人云,“世间安有两全法”。诶~~~~不好意思,有才就是任性😁。

7. 练习题

上一次我们留了一道题,说好这一次讲的。我们现在把参考答案公布如下:

total = 0
for elem in a_list:
	total += elem
print(total / len(a_list))

接下来,我们给出这次的练习题吧,请听题:

Question:
统计前面用到的二维列表nums中有多少个数字

答案可以写在评论区哦,期待下一次与你们再见,see u~

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

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

相关文章

python 语言入门

目录 1.发展历程 2.优缺点 3.环境搭建 3.1.Anaconda 3.2.VSCode 3.3.重装自己的独立环境 4.第一个 python 程序 4.1.创建一个 .py 的文件 4.2.编写 python 代码 ​4.3.运行 python 代码 5.注释 5.1.单行注释 5.2.多行注释 6.转义字符 7.变量 7.1.变量类型 7.2…

C++11 --- 智能指针详解

C11 智能指针 一、智能指针的使用场景分析二、RAII和智能指针的设计思路三、智能指针的本质及衍生的问题四、C标准库的智能指针的使用五、智能指针的原理&#xff08;模拟实现&#xff09;1. auto_ptr的模拟实现2. unique_ptr的模拟实现3. shared_ptr的模拟实现&#xff08;简单…

(实战)WebApi第13讲:怎么把不同表里的东西,包括同一个表里面不同的列设置成不同的实体,所有的给整合到一起?【前端+后端】、前端中点击标签后在界面中显示

一、实现全局跨域&#xff1a;新建一个Controller&#xff0c;其它的controller都继承它 1、新建BaseController 2、在后端配置&#xff0c;此处省略【详情见第12讲四、3、】 3、其它的控制器继承BaseController&#xff0c;这个时候就能够完成全局的跨域 【向后台传cookie和…

【C++】map和set的介绍及使用

前言&#xff1a; map和 set 是 C STL&#xff08;标准模板库&#xff09;中的两种非常重要的容器&#xff0c;它们基于一种叫做平衡二叉搜索树&#xff08;通常是红黑树&#xff09;的数据结构来实现。在 C 中&#xff0c;map 是一个键值对容器&#xff0c;set 只存储唯一的键…

Python的函数(补充浅拷贝和深拷贝)

一、定义 函数的定义&#xff1a;实现【特定功能】的代码块。 形参&#xff1a;函数定义时的参数&#xff0c;没有实际意义 实参&#xff1a;函数调用/使用时的参数&#xff0c;有实际意义 函数的作用&#xff1a; 简化代码提高代码重用性便于维护和修改提高代码的可扩展性…

el-input 正则表达式校验输入框不能输入汉字

<el-form :model"data1" :rules"rules" ref"ruleForm" label-width"210px" class"demo-ruleForm"><el-form-item label"锯路&#xff1a;" prop"sawKref"><el-input class"inptWid…

嵌入式linux系统中I2C控制实现AP3216C传感器方法

大家好,今天主要给大家分享一下,如何使用linux系统里面的I2C进行控制实现。 第一:Linux系统中I2C简介 Linux 内核开发者为了让驱动开发工程师在内核中方便的添加自己的 I2C 设备驱动程序,更容易的在 linux 下驱动自己的 I2C 接口硬件,进而引入了 I2C 总线框架。与 Linux 下…

OceanBase 应用实践:如何处理数据空洞,降低存储空间

问题描述 某保险行业客户的核心系统&#xff0c;从Oracle 迁移到OceanBase之后&#xff0c;发现数据存储空间出现膨胀问题&#xff0c;数据空间 datasize9857715.48M&#xff0c;实际存储占用空间17790702.00M。根据 required_mb - data_mb 值判断&#xff0c;数据空洞较为严重…

【flask开启进程,前端内容图片化并转pdf-会议签到补充】

flask开启进程,前端内容图片化并转pdf-会议签到补充 flask及flask-socketio开启threading页面内容转图片转pdf流程前端主js代码内容转图片-browser端browser端的同步编程flask的主要功能route,def 总结 用到了pdf,来回数据转发和合成,担心flask卡顿,响应差,于是刚好看到threadi…

QT栅格布局的妙用

当groupBox中只有一个控件时&#xff0c;我们想要它满格显示可以对groupBox使用栅格布局

MyBatis快速入门(上)

MyBatis快速入门&#xff08;上&#xff09; 一、MyBatis 简介1、概述2、JDBC、Hibernate、MyBatis 对比 二、MyBatis 框架搭建1、开发环境2、创建maven工程3、创建MyBatis的核心配置文件4、创建mapper接口5、创建MyBatis的映射文件6、通过junit测试功能7、加入log4j2日志功能 …

在Pybullet中加载Cinema4D创建的物体

首先明确我们的目标&#xff0c;是希望在cinema4D中创建自己想要的模型&#xff0c;并生成.obj文件&#xff0c;然后在pybullet中加载.obj文件作为静态物体&#xff0c;可以用于抓取物体&#xff0c;避障物体。&#xff08;本文提到的方法只能实现静态物体的建模&#xff0c;如…

第十三届交通运输研究(上海)论坛┆智能网联汽车技术现状与研究实践

0.简介 交通运输研究&#xff08;上海&#xff09;论坛&#xff08;简称为TRF&#xff09;是按照国际会议的组织原则&#xff0c;为综合交通运输领域学者们构建的良好合作交流平台。交通运输研究&#xff08;上海&#xff09;论坛已经成功举办了十二届&#xff0c;凝聚了全国百…

Pr:视频过渡快速参考(合集 · 2025版)

Adobe Premiere Pro 自带七组约四十多个视频过渡 Video Transitions效果&#xff0c;包含不同风格和用途&#xff0c;可在两个剪辑之间创造平滑、自然的转场&#xff0c;用来丰富时间、地点或情绪的变化。恰当地应用过渡可让观众更好地理解故事或人物。 提示&#xff1a; 点击下…

stm32 踩坑笔记

串口问题&#xff1a; 问题&#xff1a;会改变接收缓冲的下一个字节 串口的初始化如下&#xff0c;位长度选择了9位。因为要奇偶校验&#xff0c;要选择9位。但是接收有用数据只用到1个字节。 问题原因&#xff1a; 所以串口接收时会把下一个数据更改

昇思大模型平台打卡体验活动:项目4基于MindSpore实现Roberta模型Prompt Tuning

基于MindNLP的Roberta模型Prompt Tuning 本文档介绍了如何基于MindNLP进行Roberta模型的Prompt Tuning&#xff0c;主要用于GLUE基准数据集的微调。本文提供了完整的代码示例以及详细的步骤说明&#xff0c;便于理解和复现实验。 环境配置 在运行此代码前&#xff0c;请确保…

后悔没早点知道,Coze 插件 + Cursor 原来可以这样赚钱

最近智能体定制化赛道异常火爆。 打开闲鱼搜索"Coze 定制",密密麻麻的服务报价直接刷屏,即使表明看起来几十块的商家,一细聊,都是几百到上千不等的报价。 有趣的是,这些智能体定制化服务背后,最核心的不只是工作流设计,还有一个被很多人忽视的重要角色 —— …

基于STM32的节能型路灯控制系统设计

引言 本项目基于STM32微控制器设计了一个智能节能型路灯控制系统&#xff0c;通过集成多个传感器模块和控制设备&#xff0c;实现对路灯的自动调节。该系统能够根据周围环境光照强度、车辆和行人活动等情况&#xff0c;自动控制路灯的开关及亮度调节&#xff0c;从而有效减少能…

Qml 模型-视图-代理(贰)之 动态视图学习

目录 动态视图 动态视图用法 ⽅向&#xff08;Orientation&#xff09; 键盘导航和⾼亮 页眉与页脚 网格视图 动态视图 动态视图用法 Repeater 元素适合有限的静态数据&#xff0c; QtQuick 提供了 ListView 和 GridView, 这两个都是基于 Flickable(可滑动) 区域的元素…

新标准大学英语综合教程1课后习题答案PDF第三版

《新标准大学英语&#xff08;第三版&#xff09;综合教程1 》是“新标准大学英语&#xff08;第三版&#xff09;”系列教材之一。本书共包含6个单元&#xff0c;从难度和话题上贴近大一上学生的认知和语言水平&#xff0c;包括与学生个人生活领域和社会文化等相关内容&#x…