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