python列表的进阶

小结:

# 列表的删除小结:
# 删除列表的最后一列
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 的这两样食物删掉吧~

要求:

  1. 用 del 语句和 remove 方法分别删除 鸡油卷 和 烤鹿肉
  2. 打印出去掉上面两种食物后的食物清单。
food = ['玫瑰膏', '新栗粉糕', '鸡油卷', '燕窝', '烤鹿肉', '木樨清露']

# 用 del 语句去掉鸡油卷
del food[2]

# 用 remove() 方法去掉烤鹿肉
food.remove('烤鹿肉')

# 打印出去掉上面两种食物后的食物清单
print(food)

黛玉见宝玉对她嘘寒问暖,还送来自己爱吃的零食,心里的气消了一大半,身体也渐渐好了,没过几天,宝玉和黛玉又愉快地一块玩耍了。我们要为他们俩的和好俩鼓鼓掌~

当然,我们更要为坚持到现在的你也鼓鼓掌!列表的基本操作,“增删改查”,你都已经基本掌握了,相信在你手中,列表可以发挥出它的强大力量!

下面我们要说的知识是列表的高级操作——分片,会让你见识到 Python 这门语言的优雅。一起来继续你的大观园教学之旅吧。

分片

成绩排名列表

midterm_rank = [
  '妙玉', '薛宝钗', '贾元春', '王熙凤', '林黛玉', '贾巧姐', '史湘云',
  '贾迎春', '贾宝玉', '李纨', '贾探春', '秦可卿', '贾惜春', '贾琏'
]

看到成绩,作为老师的你,要将学生分成三批来分别谈话:

  • 排名前三的,公开表扬;
  • 排名中游,即第四到第十,适当表扬,鼓励为主;
  • 排名靠后,即最后四名,找出问题,适当批评。

我们要怎么找到这三批学生呢?这时就要用到列表的 分片 功能,来获取列表在某个范围内的元素。

列表分片用一对以冒号分隔的索引位置表示,格式为 列表[起始索引:结束索引]。比如要获取 students 中第三到第五个元素,也就是索引为 234 的元素,就要写成 students[2:5]

要特别注意,不是 students[2:4]!在这里很多同学会迷惑,老师为什么要多此一举,把范围末尾的元素索引往后挪一位呢?

Python 语言在此如此设计,其实是考虑到我们日常数数的一个漏洞,所以有意而为之。

问大家一个问题:从 77 数到到 85,一共要数多少个数字?

有的同学可能会直接两数相减,85 - 77 = 8,所以是 8 个数!

真的吗?仔细数数,其实正确算法是 85 - 77 + 1 = 9。

说完了分片的语法,你就要开始用分片分出三批学生啦。

首先找到排名前三的,也就是索引为 012 的元素。

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 中。

试着用将下面的代码补全,用分片的方式查询:

  1. 周一和周二分别是谁值日;
  2. 周三到周五是谁值日;
  3. 周末两天是谁值日。

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 吗?

我们可以按照下面的步骤来完成程序:

  1. 对分数进行排序;
  2. 去掉最高分和最低分;
  3. 对剩下的分数求和,然后算出平均分并将其打印出来。

拓展:你可以通过索引将列表的每个元素相加求和,但 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) + '分')

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值