七、Python第七课——有关列表的二三事(切片、切片的遍历和复制)

目录

一、切片 

二、遍历切片

三、列表的复制

一、切片 

       此前,我们学习了如何访问单个列表以及如何处理列表中的所有元素,那么我们如何处理列表中的部分元素呢?这就引出一个概念“切片” 。我们可以把列表看成是面包,“切片”就是要找出你最钟意的那部分进行处理(吃掉)。如此一来,这最钟意的部分一定有起点和终点。而且需要注意的是选择“切片”的全程是你告诉计算机这个傻瓜的,所以你需要指明“起点”和“终点”的下标。我读的这本书中,将下标写作为“索引”。说下标是为了和C语言做对比。

“切片”的语法规则:

#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery']  #先构建一个运动员列表
print(players[1:5])   #print函数中的“players[1:5]”即是切片,表示输出列表中第2个元素到第5个元素

       这里举例,如果你想把列表中第2个元素到第5个元素组成的部分切出来,那么你的下标就应该是1——5,我们用一段代码举例说明:

#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery']  #构建一个运动员列表
print(players[1:5])   #输出列表中第2个元素到第5个元素

       通过上面这个例子,我们应该再次清醒的认识到,机器语言中是从“0”开始的 !而我们计数第几个是从“1”开始的,所以第2个元素(人)对应的下标应该就是“1”(机器),第5个元素(人)对应的下表应该就是“4”(机器),但为啥在代码中是“5”呢?这是因为切片的终点和range()函数的末尾参数一样:都是到我们指定的终点下标的前一位停止的。我们指明切片的起点和终点后,就可以取出列表中的任一片段进行分析了。

       假如我们没有指明切片起点、终点中的任意一点,将会发生什么?(没有指明指的是没有数字,而不是“0”切记) 

#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery']  #先构建一个运动员列表
print("未指明起点的切片结果:")
print(players[:5])   #未指明起点
print("未指明终点的切片结果:")
print(players[1:])   #未指明终点

 

从实验结果得出:切片->未指明起点,从列表起点“起”;未指明终点,至列表终点“终”。

 有人问,那要是切片的两个点(终点、起点)都没指明,那将会出现什么结果?起点没有,终点没有,那就是整个列表了,这种情况我也在下面的文章也有提到。除了上述介绍的三种切片的方法(1、有起点、终点;2、无起点、有终点;3、有起点、无终点),还有另外一种方法,就是之前学的“负数索引”,例如:

#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery']  #先构建一个运动员列表
print(players[-3:])   #切出列表后三个元素

上述代码中使用“-3”下标成功切出列表后三个元素的切片!这一方法使得无论列表多长,我们都可以直接切出从“特定位置”开始,到列表末尾的切片。举一反三,如果我们的终点下标用负数,例如“-3”,就是切除列表头前3个元素的切片。切片说到这里还有一个注意的地方就是:要用“:”(冒号)分割起点和终点下标。

二、遍历切片

“遍历”就是都走一遍,都经历一遍,。那么,我们既然前面学了切片,那就直接用循环对切片进行遍历即可,这里有两种方法:

1、 先切片,后遍历。

#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery']  #先构建一个运动员列表
players_2=players[0:3]            #切出一个列表
for player in players_2:            #对刚切出的列表进行循环、遍历
    print(player)                   #遍历的同时输出

 

2、切片与遍历“同时进行”

#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery']  #先构建一个运动员列表
for player in players[0:3]:            #直接指明切片的起点和终点,并进行输出。
    print(player)                   

 这两种方法我觉得在结果上没什么区别,前者多使用了变量,后者是书中给出的标准用法。切片有以下几种使用情形:可以使用切片对数据进行批量处理;编写Web应用程序时可以使用切片来分页显示信息。

三、列表的复制

      列表的复制就是创建一个包含整个列表的切片,即不规定切片的起点和终点,有的同学就提问了,我不能直接把a列表赋值给b列表吗?我们接下来会用实际代码举例说明。

1、列表的复制

#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery']  #先构建一个运动员列表
players_1=players[:]
print("原列表为:",players)
print("复制形成的列表为:",players_1)

 

从控制台的显示结果可以看出,我们确实通过切片复制、创建了一个新的列表,但这会不会就是同一个列表?(内存存储地址一致,只是分开显示了两次) 我们通过接下来的代码对其进行测试,看这两个列表在内存中是不是分开存储的?我们分别向这俩列表追加两个不同的元素,看其结果。

#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery']  #先构建一个运动员列表
players_1=players[:]
players_1.append("jack")       #分别向这两个列表追加不同的元素(人名)再看结果
players.append("black")
print("原列表为:",players)
print("复制形成的列表为:",players_1)

实验证明,我们确实通过切片形成了一个新的列表:列表中的最后一个元素正如我们分别追加的两个元素,没有同时出现。

那么,我们现在来验证那位同学的猜想,是否可以通过直接赋值的方式来达到复制例表的目的?

#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery']  #先构建一个运动员列表
players_1=players
print("原列表为:",players)
print("复制形成的列表为:",players_1)

目前看一切正常,那么我们使用同样的方法:向这两个列表追加两个不同的元素。

#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery']  #先构建一个运动员列表
players_1=players
players.append("jack")         #向这两个列表分别追加不同的元素
players_1.append("black")
print("原列表为:",players)
print("复制形成的列表为:",players_1)

 

结果显而易见,两个列表中同时出现了追加的两个元素,这就表明不能通过简单的“赋值”达到复制列表的效果! 

这么做行不通的解释是:单纯“赋值”,其实还是将两个列表的内容关联到一起,因此这两个列表其实指向的还是同一个列表,所以才出现了两个列表在追加两个不同元素后,两个不同元素同时出现在两个列表里的结果。所以,在使用列表的副本时,还是老老实实的去“切片”。(这里的操作结果,不同于C语言,注意区别。) 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 遍历三维数组的每一个二维切片,可以使用嵌套循环来实现。首先,我们可以使用for循环遍历三维数组的第一维,然后在循环内部,再使用另外两个for循环分别遍历当前二维切片的每一行和每一列。具体实现步骤如下: ``` # 定义一个三维数组 arr = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] # 遍历每一个二维切片 for i in range(len(arr)): # 遍历当前二维切片的每一行 for j in range(len(arr[i])): # 遍历当前二维切片的每一列 for k in range(len(arr[i][j])): print(arr[i][j][k]) ``` 上述代码,变量i用于遍历第一维,变量j用于遍历二维切片的行,变量k用于遍历二维切片的列。在每次循环,我们可以通过索引操作访问当前二维切片的每一个元素,并进行相应的处理。该方法适用于任意大小的三维数组,只需要修改for循环的范围即可。 ### 回答2: 在Python,我们可以使用for循环来遍历三维数组的每一个二维切片。 具体地,我们可以首先使用for循环遍历三维数组的每一个面,然后再使用另外一个for循环遍历每个面的每一行,最后再使用第三个for循环遍历每一行的每一个元素,即每个二维切片。 具体的代码实现如下所示: ``` python arr = [[[1,2,3],[4,5,6],[7,8,9]], [[10,11,12],[13,14,15],[16,17,18]], [[19,20,21],[22,23,24],[25,26,27]]] for i in range(len(arr)): # 遍历每个面 for j in range(len(arr[i])): # 遍历每个面的每一行 for k in range(len(arr[i][j])): # 遍历每一行的每一个元素 print(arr[i][j][k]) ``` 在上述代码,我们首先定义一个三维数组arr,其包含三个面,每个面有三行三列的二维切片。 然后,我们使用三个for循环嵌套来遍历arr的每一个二维切片。具体来说,第一个for循环遍历arr的每个面,第二个for循环遍历每个面的每一行,第三个for循环遍历每一行的每一个元素,即每个二维切片。 最后,我们使用print函数将每个元素输出到控制台。这样,我们就可以遍历arr的每一个二维切片了。 ### 回答3: 在Python,可以使用嵌套循环的方式来遍历三维数组的每一个二维切片。 假设有一个三维数组arr,其维度为(m,n,p),则可以进行如下遍历: ```python for i in range(m): # 遍历第一维 for j in range(n): # 遍历第二维 for k in range(p): # 遍历第三维 slice_arr = arr[i][j] #获取当前二维切片 # 对当前切片进行操作 ``` 其,range()函数可以生成一个指定范围的整数序列,从而实现对每一维的遍历。在每一次循环,可以通过arr[i][j]获取数组的当前二维切片,从而进行相应的操作。 例如,可以在循环体打印每一个二维切片: ```python for i in range(m): for j in range(n): for k in range(p): slice_arr = arr[i][j] print(slice_arr) ``` 另外,如果需要对三维数组进行切片操作,可以使用Python切片操作符“:”,例如获取第一维为i的所有二维切片: ```python slice_arr = arr[i,:,:] ``` 同理,可以通过“:”来获取其他维度的切片。 在实际编码过程,需要根据具体的需求和数据结构来选择相应的循环方式和切片操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liO_Oil

打赏我,开启隐藏模式。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值