山地人

Python 列表(List)

山地人
山地人
2021-07-16

列表

和上一次讲到的元组(Tuple)不同,列表是一种可变序列,说白了就是列表中的元素是可以修改的。通常列表中存放的是相同类型的元素。

创建列表

通过使用一对方括号[]就可以创建一个空列表,在这个[]方括号中放入元素,元素之间用逗号隔开。这样就创建了一个有元素的列表。对于列表中的元素没有类型的限制。

emptyList = []
scores = [92, 85, 70, 86, 98]

启动终端,尝试创建一些列表。

混合类型的列表

通常列表中放置的数据是一类相同的数据,比如上面的scores里放的都是数字类型的分数。但如果你非要放置一些不同类型的数据,Python也是允许你这么做的。

# 不推荐
badList = [2020,"Python", 98]
# 推荐用元祖
course = (2020,"Python", 98)

嵌套列表

你也可以创建嵌套的列表:一个列表的内部项也是列表。嵌套列表中的元素类型和数量都是没有要求的。你可以按照业务的需求灵活应用。

data = [[5,2,1],[3,8],[7]]

访问列表元素

和元组一样,你可以使用索引来访问列表中的元素。

正向索引

在列表后跟上一对[index]方括号,括号中的index是>=0的整数值,如scores[0]访问到scores中的第一个元素,scores[1]对应scores中的第二个元素,依次类推。

scores = [92, 85, 70, 86, 98]
scores[0] # 92
scores[1] # 85

反向索引

当然,也可以使用一个负整数作为索引来访问列表中的元素,如[-1]代表列表最右侧的第一个元素,[-2]代表列表右侧倒数第二个元素,依次类推。

scores = [92, 85, 70, 86, 98]
scores[-1] # 98
scores[-2] # 86

切片索引

除了上面的两种访问方式,Python还提供了一种切片访问列表的方式,[start:end]在方括号中start表示要访问的列表中的起始索引,:冒号右侧的end代表要访问列表中的结束位置索引(注意不包含end位置的元素)。通过这种方式,就可以获得列表中start索引到end索引之前的所有子元素构成的子列表。就仿佛在这个列表中切出一个部分,所以也叫做切片索引

[start:end]这种索引中的startend是可以省略的

  • start省略后,默认会是0[:end]等同于[0:end],意思是从第一个元素一直到end位置前一个元素。
  • end省略后,默认会是-1[start:]等同于[start:-1],意思是从start索引位置的元素一直到最后一个元素。
  • [:]对于这种:前后都省略的情况,也就意味着访问整个列表上的所有元素。
scores = [92, 85, 70, 86, 98]
scores[0:1] # [92]
scores[2:4] # [70, 86]
scores[:2] # [92, 85]
scores[2:] # [70, 86, 98]
scores[2:-2] # [70]
scores[-4:-2] # [85, 70]
scores[-4:2] # [85]

这里最后一个scores[-4:2]看似有点奇怪,起始索引-4对应的是scores中的85,所以-4索引其实也就是正数的索引1,所以scores[-4:2]等价于scores[1:2]所以结果就是[85]

启动终端,尝试用不同的索引来访问列表中的元素。

修改单个元素

前面我们已经学会了通过索引的方式来访问到元素,由于列表时可变动数据,所以我们可以对拿到的元素进行修改。

先获取到要修改的元素,然后直接用=赋值号对此元素的值进行修改。

scores = [92, 85, 70, 86, 98]
scores[0] = 99

启动终端,修改下scores中的第一个元素的值,然后重新用scores检查下第一个元素是否被修改掉。

追加和插入元素

对于列表,有些时候我们希望往列表尾部添加一些新元素,这就是追加元素

首先通过[:]切片方式获取到元素尾部的切片,然后对其添加一个子列表

注意,这里获取元素尾部是指元素最后一个元素后面的索引位置,比如scores中最后一个元素索引是[4]这里的切片要设置为[5:]

这个过程有点类似,编辑文本时,将光标定位到这行文字的末尾的感觉。

scores = [92, 85, 70, 86, 98]
scores[5:] = [60,70,80]

搞清楚了追加元素的操作方法,你也就明白,如何往元素其他位置插入或修改元素了,先用切片索引选择好要插入或者修改的索引位置,然后设置一个新的子元素列表即可。

scores = [92, 85, 70, 86, 98]
# 往85的后面插入元素
scores[1:1] = [100]

如果要往第一个元素之前插入元素,那就用切片选择到第一个元素的前面位置上,[0:1]表示第一个元素的子列表,所以[0:0]表示第一个元素之前的一个子列表,我们给这个子列表设置一个新的子列表[100]

scores = [92, 85, 70, 86, 98]
# 往头部插入元素
scores[0:0] = [100]

启动终端,往列表中追加和插入操作。(只有多动手操作,才能真正理解)

删除和修改部分元素

删除和修改列表中的部分元素,思路和上一小节的插入和追加元素的方式是类似的。选择好要修改的元素切片,对其设置一个新的子列表,如果新的子列表为空列表[],这就是删除操作,如果新的子列表中有元素,这就是修改操作。

  • 删除元素
    scores = [92, 85, 70, 86, 98]
    # 删除[85,70]
    scores[1:3] = []
  • 修改元素
    scores = [92, 85, 70, 86, 98]
    # 删除[85,70]
    scores[1:3] = [100]

启动终端,试试删除下元素。(只有多动手操作,才能真正理解)

遍历列表

对一个列表进行遍历(循环其中每一个元素)有很多方法,这里利用for in循环展示几种常用的列表遍历方法。

列表相关方法

前面我们都是通过索引和切片索引的方式来操作列表,列表自身也有很多丰富的方法可以使用。

你可以通过在Python的交互命令行中输入help(list)来查看列表的相关方法。

启动终端,查看list帮助文档。

list相关的成员函数列表

方法名说明例子
append(elem)往列表尾部追加一个元素scores.append(100)
extend(iterable)将一个可迭代对象中的所有元素都添加到列表尾部scores.extend([80,90])
insert(index, elem)在列表的指定index索引处插入一个元素scores.insert(2,90)
remove(elem)从列表中移除首个匹配元素scores.remove(85)
pop(index)从列表中移除指定索引的元素并返回此元素scores.pop(2)
clear()清空列表中所有元素scores.clear()
index(elem)返回首个匹配元素的索引scores.index(85)
count(elem)返回列表中匹配元素的个数scores.count(85)
sort()按照指定升降序,对列表中的元素排序scores.sort()
reverse()反转列表中全部元素的顺序scores.reverse()
copy()对列表进行浅层克隆scores.copy()

运行沙盒,测试列表的相关方法。

至此,本篇教程也到了该和你说再见的时候了,我们下期再见。

学完本篇互动教程,如果你觉得体验不错,可以把网页链接发送给你的小伙伴,让他/她也来感受一下。当然,你也可以继续看看网站上其他的的互动教程,希望`idev365`能够给你带来收获。

学习教程的过程中碰到了问题,或者对idev365有什么改进意见和想法,欢迎加入idev365微信内测群,和山地人交流你的想法。