小结:
# 列表的删除小结:
# 删除列表的最后一列
punished = students.pop()
print('被罚站的人是:' + punished + ',同学们引以为戒。')
# 根据下标删除
del students[0]
#根据名称删除
students.remove('王熙凤')
在今天的课程里,我们会继续学习更多的列表操作方法,准备好了吗?
在上一关中我们说过,数据的“变动”方式有三种,分别是“添加”、“修改”和“删除”,我们已经学了“添加”和“修改”的基本操作,下面我就来讲讲列表元素的“删除”。
列表元素的删除
你在大观园的课堂上,已经有了 14 位学生,你将他们的名字储存在了 students
这个列表里。
students = [
'林黛玉', '薛宝钗', '贾元春', '贾探春', '史湘云', '妙玉', '贾迎春',
'贾惜春', '王熙凤', '贾琏', '贾巧姐', '李纨', '秦可卿', '贾宝玉'
]
同学们和往常一样,课下说说笑笑,课上认真学习你教的知识,但唯一有点不一样的地方,是宝玉最近好像有些心不在焉。
原来他和林妹妹闹了点小矛盾,因而心情低落,上课也不好好听了。你在讲台上说得酣畅淋漓,他却在课桌上神游太虚,这让你甚为火大,于是你打算让宝玉罚站,并让他下节课不准来上课。
这样,下一节课的花名册要修改了,
首先记录罚站的人,再把这个人名字删除。Python 的列表就支持这种操作,我们可以用列表的 pop()
方法实现。
pop()
的功能是:返回列表指定位置的元素,并删除这个元素。 pop()
可以传入一个参数,表示要删除的元素的索引,如果不传入,就默认为最后一个元素的索引。
宝玉恰好是名单上的最后一个名字,所以我们可以这样操作:
# 去除最后一个
students.pop()
# 下面来验证操作过后的名单
print(len(students)) # len() 函数用于获取序列的元素个数
# 输出:13
“pop”作为英文单词,除了我们熟悉的“流行”的意思,还能表示“气泡冒出水面”。我们想象一下水中的气泡冒出水面的样子:气泡一个个离开水下的位置,冒到水面让大家看到。
当然,我们可以定义一个变量来捕获这个冒出的“气泡”,进行下一步操作。比如,你不想光打印出宝玉的名字,还要加工成完整的语句通知大家。这时候就可以定义变量 punished
,用来捕获 pop()
方法返回并删除的元素后再进行操作。下面我们重新来操作惩罚宝玉前的 14 人花名册:
punished = students.pop()
print('被罚站的人是:' + punished + ',同学们引以为戒。')
# 输出:被罚站的人是:贾宝玉,同学们引以为戒。
通知发完了,宝玉找到你向你道歉,说接受惩罚,不该因为个人私事而影响学习。你也原谅了宝玉,希望他下次不要再犯啦。你也希望下一节课,students
列表中的剩下的 13 个人都能认真听讲,不要像宝玉一样开小差。
这时黛玉来找老师您请假,她气色不佳,说话有气无力,原来是染了风寒,下一节课也不能来了。你让黛玉好好回去休息,然后还得再删除一个名字。不过这次,就不用把名字公示出来了。那么我们可以使用更加便捷的 del
语句来操作列表,格式为:del 列表[索引]
。
“del”是单词 “delete”(删除)的缩写。del 列表[索引]
意思就是“删除列表中指定索引的元素”。这里正向和反向索引都是支持的。
我们知道黛玉是列表的第一个元素,那么操作方法如下:
# 黛玉索引为 0
del students[0]
# 验证一下是否成功
print(len(students))
# 输出:12
这样,我们就在名单上成功删除了黛玉的名字。
我们来捋一捋上面删除操作的逻辑:首先找到这个元素(通过元素索引),再删除这个找到的元素。
说到这里,同学们有没有联想到上一关的内容——元素的查找?列表中的元素可以通过索引查找,也可以通过值来查找。刚刚介绍的是通过索引找到元素再删除,那么可不可以通过值来找到元素再删除呢?
答案是肯定的。下面我们就来介绍 remove()
方法。通过 列表.remove(值)
的方式,我们可以在列表中找到 第一个 指定的值,然后将它删除。
这不,王熙凤也来找老师您请假了,要去打点大观园府里的事务,有些忙,下节课也不能来了。这次的删除操作,我们就试试不用索引,不去数王熙凤在列表里的位置,而是用刚刚说的 remove()
直接通过姓名来删除:
students.remove('王熙凤')
# 验证一下是否成功
print(len(students))
# 输出:11
练习:
大观园这样的钟鸣鼎食之家,膳食品种丰富,名目繁多,就连零食也是琳琅满目。林妹妹这几天的风寒还没痊愈,宝玉也是心急,便想着给林妹妹送点儿好吃的。他走进膳房,见着其中正摆着这几种食物:
玫瑰膏、新栗粉糕、鸡油卷、燕窝、烤鹿肉和木樨清露。
宝玉心想,好吃的虽多,但有的还是太油了,林妹妹现在的身子怕是吃不得,还是去掉几样,再送给她吧。于是他决定将食物中的 鸡油卷 和 烤鹿肉 去掉。
来帮帮宝玉,补全代码,将 food
的这两样食物删掉吧~
要求:
- 用
del
语句和remove
方法分别删除 鸡油卷 和 烤鹿肉。 - 打印出去掉上面两种食物后的食物清单。
food = ['玫瑰膏', '新栗粉糕', '鸡油卷', '燕窝', '烤鹿肉', '木樨清露']
# 用 del 语句去掉鸡油卷
del food[2]
# 用 remove() 方法去掉烤鹿肉
food.remove('烤鹿肉')
# 打印出去掉上面两种食物后的食物清单
print(food)
黛玉见宝玉对她嘘寒问暖,还送来自己爱吃的零食,心里的气消了一大半,身体也渐渐好了,没过几天,宝玉和黛玉又愉快地一块玩耍了。我们要为他们俩的和好俩鼓鼓掌~
当然,我们更要为坚持到现在的你也鼓鼓掌!列表的基本操作,“增删改查”,你都已经基本掌握了,相信在你手中,列表可以发挥出它的强大力量!
下面我们要说的知识是列表的高级操作——分片,会让你见识到 Python 这门语言的优雅。一起来继续你的大观园教学之旅吧。
分片
成绩排名列表
midterm_rank = [
'妙玉', '薛宝钗', '贾元春', '王熙凤', '林黛玉', '贾巧姐', '史湘云',
'贾迎春', '贾宝玉', '李纨', '贾探春', '秦可卿', '贾惜春', '贾琏'
]
看到成绩,作为老师的你,要将学生分成三批来分别谈话:
- 排名前三的,公开表扬;
- 排名中游,即第四到第十,适当表扬,鼓励为主;
- 排名靠后,即最后四名,找出问题,适当批评。
我们要怎么找到这三批学生呢?这时就要用到列表的 分片 功能,来获取列表在某个范围内的元素。
列表分片用一对以冒号分隔的索引位置表示,格式为 列表[起始索引:结束索引]
。比如要获取 students
中第三到第五个元素,也就是索引为 2
,3
,4
的元素,就要写成 students[2:5]
。
要特别注意,不是 students[2:4]
!在这里很多同学会迷惑,老师为什么要多此一举,把范围末尾的元素索引往后挪一位呢?
Python 语言在此如此设计,其实是考虑到我们日常数数的一个漏洞,所以有意而为之。
问大家一个问题:从 77 数到到 85,一共要数多少个数字?
有的同学可能会直接两数相减,85 - 77 = 8,所以是 8 个数!
真的吗?仔细数数,其实正确算法是 85 - 77 + 1 = 9。
说完了分片的语法,你就要开始用分片分出三批学生啦。
首先找到排名前三的,也就是索引为 0
,1
,2
的元素。
print(midterm_rank[0:3])
# 输出:['妙玉', '薛宝钗', '贾元春']
对于从头开始的分片,Python 支持更加简便的写法,省去开始的 0。所以,这样写也是可以的:
print(midterm_rank[:3])
# 输出:['妙玉', '薛宝钗', '贾元春']
接下来我们来找出排在中游,排名第四到第十的七名同学,他们的起始索引是 3
,结束索引是 3+7=10
。
print(midterm_rank[3:10])
# 输出:['王熙凤', '林黛玉', '贾巧姐', '史湘云', '贾迎春', '贾宝玉', '李纨']
操作成功!原来还担心宝玉那段时间心不在焉,成绩会垫底,但是没有,看来后面还是下了一番功夫的。
最后,我们要找出排名靠后的四个学生啦,他们的索引是 10
到 13
。和从列表起始处开始的分片一样,这种截取最后几个元素的分片可以简写成 list[start:]
的形式:
print(midterm_rank[10:])
# 输出:['贾探春', '秦可卿', '贾惜春', '贾琏']
这样我们就找出了这三批学生,轮到老师你和他们分别谈话,表示表扬和鼓励啦。
练习:
你正在安排大观园班下一周的值日表,一周七天每天都要有一个同学负责班里的卫生。你将他们的值日排班按周一到周日的顺序写进了列表 on_duty
中。
试着用将下面的代码补全,用分片的方式查询:
- 周一和周二分别是谁值日;
- 周三到周五是谁值日;
- 周末两天是谁值日。
on_duty = ['贾琏', '王熙凤', '林黛玉', '贾宝玉', '李纨', '薛宝钗', '妙玉']
# 打印周一周二值日的人
print(on_duty[:2])
# 打印周三到周五值日的人
print(on_duty[2:5])
# 打印周末值日的人
print(on_duty[5:])
列表常用方法
我们对列表的操作,还有统计、排序、反转、复制、清空等。
老师给你整理了一些常用方法,可以把图片保存下来,再根据需要查找相应的方法。
统计元素出现的次数
count()
方法可以统计元素在列表中出现的次数,使用起来很简单:
students = ['林黛玉', '贾宝玉', '薛宝钗', '贾宝玉']
print(students.count('贾宝玉'))
# 输出:2
排序
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]
反转、复制和清空
剩下的 reverse()
、copy()
、clear()
方法比较简单,我们直接看代码和运行结果来认识它们:
# reverse() 方法:将列表顺序反转
students = ["林黛玉", "贾宝玉", "薛宝钗"]
students.reverse()
print(students)
# 输出:['薛宝钗', '贾宝玉', '林黛玉']
# copy() 方法:复制一个同样的列表
students1 = ["林黛玉", "贾宝玉", "薛宝钗"]
students2 = students1.copy()
print(students2)
# 输出:['林黛玉', '贾宝玉', '薛宝钗']
# clear() 方法:清空列表
students = ["林黛玉", "贾宝玉", "薛宝钗"]
students.clear()
print(students)
# 输出:[]
reverse()
方法在需要倒序输出列表内容时很实用。而 copy()
和 clear()
方法你可能比较困惑,直接将 students2 = students1
不就复制了同样的列表,直接 students = []
不就清空了列表了吗?为什么还要 copy()
和 clear()
方法。我直接用代码给你解释吧!
students1 = ["林黛玉", "贾宝玉", "薛宝钗"]
students2 = students1
students1[0] = '袭人'
print(students2)
# 输出:['袭人', '贾宝玉', '薛宝钗']
可以看到,我们明明只改了列表 students1
的元素,students2
却也跟着变了!所以,我们可以知道,students2 = students1
并不是复制一个列表,而是给原先的列表一个新的称号 students2
。
练习:
你将 14 名学生的在上一节中的期中考试成绩放入了名为 scores
的列表中,不过还没有进行排序。
现在,你需要统计这次考试成绩的极差(最高分与最低分的差值),以及有多少人考了满分 100 分。
来完善代码,算出上面需要的两个值吧~
scores = [100, 92, 77, 85, 81, 90, 100, 86, 79, 93, 91, 96, 75, 84]
# 对 scores 进行排序
scores.sort()
# 计算这次考试成绩的极差
result = scores[-1] - scores[0]
print(result)
# 统计考100分的人数
print(scores.count(100))
本章回顾
在今天的 列表进阶 课程中,我们学习了列表元素的删除,用 pop()
返回并删除指定位置的元素,用 del
语句通过索引删除元素,用 remove()
方法通过具体的值删除元素。
我们学习了列表的重要操作 分片,用 列表[起始索引:结束索引]
的格式感受 Python 的优雅。
在 列表常用方法 一节,老师向大家介绍了几种实用的列表方法,同学们可以借助课程中的举例理解内化,或者拿小本本记下来,在编写代码时灵活取用。
本章练习
练习一:
刚刚听班主任讲她看到几门考试的倒数三名里都有贾宝玉和秦可卿,我们来统计贾宝玉和秦可卿他们到底在几门课里是倒数前三呢?
要求: 在屏幕上分别打印出:
贾宝玉排在倒数三名的次数是 xxx
秦可卿排在倒数三名的次数是 xxx
注意:要将 xxx 替换为计算的结果哦~
code_ranks = [
'贾惜春', '贾巧姐', '李纨',
'秦可卿', '史湘云', '王熙凤',
'薛宝钗', '林黛玉', '妙玉',
'贾迎春', '贾宝玉', '探春'
]
chinese_ranks = [
'林黛玉', '薛宝钗', '贾宝玉',
'贾探春', '史湘云', '贾迎春',
'贾惜春', '王熙凤', '贾巧姐',
'李纨', '妙玉', '秦可卿'
]
math_ranks = [
'王熙凤', '贾迎春', '妙玉',
'林黛玉', '贾惜春', '贾巧姐',
'贾探春', '史湘云', '秦可卿',
'李纨', '薛宝钗', '贾宝玉'
]
# 定义函数,计算某个学生出现在倒数三名的总次数
def last_three(name):
index = 0
codes = code_ranks[-3:].count(name)
chines = chinese_ranks[-3:].count(name)
maths = math_ranks[-3:].count(name)
# 也可写为:
# index = codes + chines + maths
if codes > 0:
index = index + 1
if chines > 0:
index = index + 1
if maths > 0:
index = index + 1
return index
print('贾宝玉排在倒数三名的次数是', last_three('贾宝玉'))
print('秦可卿排在倒数三名的次数是', last_three('秦可卿'))
练习二:
歌手大赛
学校组织了歌手大赛,8 名评委对每位歌手进行打分,去掉一个最高分和一个最低分,剩下 6 名评委的分数的平均数就是歌手的最终成绩。贾宝玉也来参加歌手大赛了,你能帮他算出他的最终得分 average_score
吗?
我们可以按照下面的步骤来完成程序:
- 对分数进行排序;
- 去掉最高分和最低分;
- 对剩下的分数求和,然后算出平均分并将其打印出来。
拓展:你可以通过索引将列表的每个元素相加求和,但 Python 中有更简便的方式——
sum()
函数。将需要求和的列表传入sum()
函数即可得到列表中所有元素相加后的值。
scores = [92.1, 93.6, 88.2, 91.2, 85.7, 94.5, 95.1, 90.6]
scores.sort()
del scores[0]
del scores[-1]
average_score = sum(scores) / len(scores)
# print(sum)
# 打印最后的平均分
print(average_score)
编程期中考试,大观园的编程老师出了 10 道题给大家。贾宝玉的试卷已经改完了,你能帮老师算出贾宝玉考了多少分吗?
计分规则为:前 5 题每道题 5 分,后 5 题每道题 10 分。
data = ['对', '错', '错', '对', '错', '对', '对', '对', '错', '对']
left = data[:5].count('对') * 5
right = data[5:].count('对') * 10
score = left + right
print('贾宝玉的分数是' + str(score) + '分')