在 Python 中,列表是一种有序的集合,可以储存 0 到多个不同类似的元素。定义一个列表,我们需要用中括号把里面的元素包裹起来,并且用 英文逗号分隔。
在列表元素的查找上,我们可以通过索引来获取我们想要的元素。 列表的索引分为正向索引和反向索引。正向索引从0开始,反向索引从-1开始。
列表的修改上,我们使用列表[索引] = 新值的方法修改对应位置的元素。
此外,我们还学习了两个实用的列表方法, 用 append() 和 insert() 方法来实现列表元素的添加。列表.append(“a”)用于在列表末尾添加一个元素a,列表.insert(x,“a”)用于在列表索引为x的位置插入a。
##列表元素的删除
pop() 的功能是:返回列表指定位置的元素,并删除这个元素。 pop() 可以传入一个参数,表示要删除的元素的索引,如果不传入,就默认为最后一个元素的索引。
举一个例子,有一个14人的列表作为大观园课堂上课的花名册
students = ['林黛玉', '薛宝钗', '贾元春', '贾探春', '史湘云','妙玉',
'贾迎春', '贾惜春', '王熙凤', '贾琏','贾巧姐','李纨', '秦可卿', '贾宝玉']
宝玉他和林妹妹闹了点小矛盾,因而心情低落,上课也不好好听了。你在讲台上说得酣畅淋漓,他却在课桌上神游太虚,这让你甚为火大,于是你打算让宝玉罚站,并让他下节课不准来上课。我们需要从列表中删除宝玉这个元素。宝玉恰好是名单上的最后一个名字,所以我们可以这样操作:
students.pop()
# 下面来验证操作过后的名单
print(len(students)) # len() 函数用于获取序列的元素个数
# 输出:13
以上的代码中,第一行 pop() 括号内也可以填上宝玉的索引,写成 students.pop(13),这两种写法是等价的,屏幕上都会打印出贾宝玉的名字,而 students 的名单上变为 13 个人。需要注意的是pop()会将删除的元素值返回。
可以定义变量 punished ,用来捕获 pop() 方法返回并删除的元素后再进行操作。下面我们重新来操作惩罚宝玉前的 14 人花名册:
punished = students.pop()
print('被罚站的人是:' + punished + ',同学们引以为戒。')
# 输出:被罚站的人是:贾宝玉,同学们引以为戒。
这时黛玉来找老师您请假,她气色不佳,原来是染了风寒,下一节课也不能来了。你让黛玉好好回去休息。不过这次,就不用把名字公示出来了。那么我们可以使用更加便捷的 del 语句来操作列表,格式为:del 列表[索引]。
“del”是单词 “delete”(删除)的缩写。del 列表[索引] 意思就是“删除列表中指定索引的元素”。这里正向和反向索引都是支持的。
我们知道黛玉是列表的第一个元素,那么操作方法如下:
# 黛玉索引为 0
del students[0]
# 验证一下是否成功
print(len(students))
# 输出:12
remove()方法。通过 列表.remove(值) 的方式,我们可以删除列表中的特定值。
students.remove('王熙凤')
# 验证一下是否成功
print(len(students))
# 输出:11
分片
列表分片用一对以冒号分隔的索引位置表示,格式为 列表[起始索引:结束索引]。比如要获取 students 中第三到第五个元素,也就是索引为 2,3,4 的元素,就要写成 students[2:5]。方便计算该分片有5-2=3个元素。
我们发现,截取前三个元素,就写成 list[:3];而截取最后四个元素,就写成 list[-4:];截取中间部分 list[a:b],分片长度就是 b - a。这些常用列表操作都极其直观和简便。
sort() 是一个很强大的方法,可以对列表内的元素进行排序,直接调用 students.sort() 后,Python 会使用默认的排序方法对其排序。不同数据类型的排序方法不一样,我们来看看对字符串列表和数值列表进行排序的不同:
str_list = ["lin", "jia", "xue"]
str_list.sort()
print(str_list)
# 输出:['jia', 'lin', 'xue']
num_list = [4, 2, 1, 9]
num_list.sort()
print(num_list)
# 输出:[1, 2, 4, 9]
- 字符串列表的排序按照每个元素首字母的顺序来排序,比如 j 在 l 前面,l 在 x 前面,可以简单地按照 26 个字母顺序表即可。
- 数值列表的排序是按照数值大小从小到大进行排序,比如 1 比 2 小,所以 1 在 2 前面。
# reverse() 方法:将列表顺序反转
students = ["林黛玉", "贾宝玉", "薛宝钗"]
students.reverse()
print(students)
# 输出:['薛宝钗', '贾宝玉', '林黛玉']
# copy() 方法:复制一个同样的列表
students1 = ["林黛玉", "贾宝玉", "薛宝钗"]
students2 = students1.copy()
print(students2)
# 输出:['林黛玉', '贾宝玉', '薛宝钗']
# clear() 方法:清空列表
students = ["林黛玉", "贾宝玉", "薛宝钗"]
students.clear()
print(students)
# 输出:[]
students1 = ["林黛玉", "贾宝玉", "薛宝钗"]
students2 = students1
students1[0] = '袭人'
print(students2)
# 输出:['袭人', '贾宝玉', '薛宝钗']
可以看到,我们明明只改了列表 students1 的元素,students2 却也跟着变了!所以,我们可以知道,students2 = students1 并不是复制一个列表,而是给原先的列表一个新的称号 students2。copy() 方法不同之处在于,它会新建一个 students2 的列表,里面放着和 students1 一样的内容,彼此互不干扰。
clear() 方法也是类似的,直接使用 students = [] 并不是将原来的列表清空,而是将“students”这个名称冠到一个新建的空列表上,clear() 方法是直接对原来的那个列表进行操作。
students1 = students 操作后,两者其实是同一列表的不同名字,对任意一个列表的操作都会影响另一个。
下面是练习题部分:
1.刚刚听班主任讲她看到几门考试的倒数三名里都有贾宝玉和秦可卿,我们来统计贾宝玉和秦可卿他们到底在几门课里是倒数前三呢?
要求: 在屏幕上分别打印出:
贾宝玉排在倒数三名的次数是 xxx
秦可卿排在倒数三名的次数是 xxx
code_ranks = [
'贾惜春', '贾巧姐', '李纨',
'秦可卿', '史湘云', '王熙凤',
'薛宝钗', '林黛玉', '妙玉',
'贾迎春', '贾宝玉', '探春'
]
chinese_ranks = [
'林黛玉', '薛宝钗', '贾宝玉',
'贾探春', '史湘云', '贾迎春',
'贾惜春', '王熙凤', '贾巧姐',
'李纨', '妙玉', '秦可卿'
]
math_ranks = [
'王熙凤', '贾迎春', '妙玉',
'林黛玉', '贾惜春', '贾巧姐',
'贾探春', '史湘云', '秦可卿',
'李纨', '薛宝钗', '贾宝玉'
]
# 定义函数,计算某个学生出现在倒数三名的总次数
def last_three(student):
time1=code_ranks[-3:].count(student)
time2=chinese_ranks[-3:].count(student)
time3=math_ranks[-3:].count(student)
total=time1+time2+time3
return total
print('贾宝玉排在倒数三名的次数是',last_three("贾宝玉"))
print('秦可卿排在倒数三名的次数是',last_three("秦可卿"))
贾宝玉排在倒数三名的次数是 2
秦可卿排在倒数三名的次数是 1