课程库 › AI 主线 › Python 进阶语法 › 第 1 课
列表进阶 —— 切片、排序、列表推导式
普通课约 60 分钟
本课导读
欢迎来到阶段 1。阶段 0 里你已经会创建列表、按下标取值、用 for 遍历、用 append 添加——这些是"一个一个处理"的功夫。本课解锁三个"一批一批处理"的动作:切片(一刀取一段)、排序(一键排整齐)、列表推导式(一行造新表)。学完后,"取销量前三""把一批名字洗干净"这类活儿,你能一行写完。预计 60 分钟。
先热身:你已经会的
都眼熟?很好。但注意:这些动作每次只碰一个元素。现实工作里更常见的需求是"取一段""按大小排好""把每一个都加工一遍"——这正是本课三件套的用武之地。
一、切片:一刀取一段
运营小林拿到了近 6 天的订单量,想看"最近 3 天"的数据。逐个取太笨,切片一刀搞定:
语法拆解 列表[起点:终点]:
- 取的范围是含起点、不含终点——
[1:4]取下标 1、2、3,共4-1=3个 - 省略起点就是"从头",省略终点就是"到尾"
- 负数下标从尾巴倒着数:
-1是最后一个,所以[-3:]是"最后 3 个"
提示
类比记忆:把列表想成一条吐司面包,下标是切痕的编号。[1:4] 就是"从第 1 道切痕切到第 4 道切痕"——拿到的是两刀之间的部分,所以不含终点那一片。"含头不含尾"是 Python 的通用约定,range 也是这个脾气。
有个隐藏福利:切片不动原列表,切出来的是一份新拷贝——原数据完好无损,随便切。
二、排序:一键排整齐
教师老周有一份考试成绩,想从高到低排出来。排序有两个工具,脾气不同:
两者的区别就一句话:
sorted(列表)——复印一份再排,原件不动,排好的新列表用变量接住列表.sort()——直接在原件上排,不返回新列表(接了也是 None)- 两者都支持
reverse=True:从大到小
说明
新手第一坑:ranked = scores.sort() —— ranked 会是 None!.sort() 干完活不交货(它改的是原列表)。要"接住结果"就用 sorted()。记法:sorted 有 ed,是"排好的"副本;.sort() 是命令,让它自己排。
排字符串也一样顺手,默认按字母表:
key= 是排序的"评分标准":默认拿元素本身比大小,指定 key=len 就改成拿长度比。往 key 里塞自己写的评分函数,等到本单元"函数进阶"课再解锁——现在会用 len 和 str.lower 这两个现成的就够。
三、列表推导式:一行造新表
营销部拿到一批含税价格,要全部换算成折后价。阶段 0 的写法你会:
prices = [100, 250, 80, 400]
discounted = []
for p in prices: # 建空表 → 遍历 → 加工 → append,四步
discounted.append(p * 0.8)
列表推导式把这四步压成一行:
读法有窍门——从 for 读起,回头看加工,最后看条件:
[p * 0.8 for p in prices]:对 prices 里每个 p(for 部分),产出 p * 0.8(加工部分)[p for p in prices if p >= 100]:每个 p 里,只留满足 if 的,原样产出- 结构总结:
[加工 for 元素 in 列表 if 条件],if 部分可省略
提示
类比记忆:推导式是一条流水线——原料(prices)在传送带上过一遍,先过质检门(if 条件,不合格的直接掉下线),再过加工台(for 前面的表达式),产出装进新箱子。旧箱子原封不动。
说明
什么时候用推导式?"从一个列表产出另一个列表"时它最漂亮;但如果加工逻辑复杂到要换行、要嵌套判断,老老实实写 for 循环更清楚。一行读得懂就用,读不懂就展开——代码是写给三个月后的自己看的。
组合拳:三件套连招
真实需求往往是连招。行政小美统计部门团建报名费,想要"报名费从高到低的前三名":
第二个例子值得多看一眼:n.strip() 去首尾空格(阶段 0 的老朋友),if 把洗完还是空串的条目拦在门外——清洗数据这个动作,你在阶段 1 后半段的 pandas 课里会天天做,这就是它的迷你版。
✍️ 练习
练习 1:一周的中间三天
用切片从 7 天访问量里取出周三到周五(下标 2、3、4)这三天的数据,打印出来。
✅ 参考答案
visits = [820, 930, 1150, 1080, 1240, 660, 590]
mid = visits[2:5] # 含头不含尾:下标 2、3、4
print(mid)
练习 2:畅销榜前三
先把销量从大到小排好(不许改动原列表 sales),再切出前三名打印。
💡 提示
"不许改原列表"是在提示你选 sorted() 还是 .sort()。排好之后就是练习 1 的切片。两步可以并成一行。
✅ 参考答案
sales = [180, 95, 260, 140, 320, 75]
top3 = sorted(sales, reverse=True)[:3]
print(top3)
print(sales) # 验证原列表没变
练习 3:邮箱清洗流水线(挑战)
用一个列表推导式完成:把列表里的邮箱全部转小写(.lower()),并且只保留含 "@" 的合法条目。
💡 提示
套结构 [加工 for 元素 in 列表 if 条件]:加工是 e.lower(),条件是 "@" in e。字符串的 in 判断"是否包含",阶段 0 学过。
✅ 参考答案
emails = ["Ada@Work.com", "bob(at)mail", "CARL@HOME.NET", "无"]
valid = [e.lower() for e in emails if "@" in e]
print(valid)
📝 随堂测验
1. nums = [10, 20, 30, 40, 50],nums[1:3] 的结果是?
2. 想取列表最后两个元素,最顺手的写法是?
3. ranked = scores.sort() 之后,ranked 的值是什么?
4. sorted(words, key=len) 是按什么规则排序?
5. [x * 2 for x in [1, 2, 3] if x > 1] 的结果是?
本课小结
- 切片
列表[起点:终点]:含头不含尾;省略端点=到头/到尾;负下标从尾数;切出来是新拷贝 - 排序:
sorted()复印再排(接得住),.sort()原地排(返回 None);reverse=True降序,key=换评分标准 - 推导式
[加工 for 元素 in 列表 if 条件]:流水线一行造新表;读不懂就老实写 for - 连招
sorted(...)[:3]和"清洗过滤"是数据处理的日常动作,pandas 课里天天见
下一课给字典和集合也升个级——嵌套结构登场,那是你未来读懂 JSON 和 API 返回数据的直觉地基。
划选正文任意文字可高亮、批注或加入复习卡
讨论
载入中…