学径XUEJING · 个人学习平台通知设置

课程库 AI 主线 Python 进阶语法 › 第 1

列表进阶 —— 切片、排序、列表推导式

普通课60 分钟

本课导读

欢迎来到阶段 1。阶段 0 里你已经会创建列表、按下标取值、用 for 遍历、用 append 添加——这些是"一个一个处理"的功夫。本课解锁三个"一批一批处理"的动作:切片(一刀取一段)、排序(一键排整齐)、列表推导式(一行造新表)。学完后,"取销量前三""把一批名字洗干净"这类活儿,你能一行写完。预计 60 分钟。

先热身:你已经会的

Python

都眼熟?很好。但注意:这些动作每次只碰一个元素。现实工作里更常见的需求是"取一段""按大小排好""把每一个都加工一遍"——这正是本课三件套的用武之地。

一、切片:一刀取一段

运营小林拿到了近 6 天的订单量,想看"最近 3 天"的数据。逐个取太笨,切片一刀搞定:

Python

语法拆解 列表[起点:终点]

  • 取的范围是含起点、不含终点——[1:4] 取下标 1、2、3,共 4-1=3
  • 省略起点就是"从头",省略终点就是"到尾"
  • 负数下标从尾巴倒着数:-1 是最后一个,所以 [-3:] 是"最后 3 个"

提示

类比记忆:把列表想成一条吐司面包,下标是切痕的编号。[1:4] 就是"从第 1 道切痕切到第 4 道切痕"——拿到的是两刀之间的部分,所以不含终点那一片。"含头不含尾"是 Python 的通用约定,range 也是这个脾气。

有个隐藏福利:切片不动原列表,切出来的是一份新拷贝——原数据完好无损,随便切。

二、排序:一键排整齐

教师老周有一份考试成绩,想从高到低排出来。排序有两个工具,脾气不同:

Python

两者的区别就一句话:

  • sorted(列表)——复印一份再排,原件不动,排好的新列表用变量接住
  • 列表.sort()——直接在原件上排,不返回新列表(接了也是 None)
  • 两者都支持 reverse=True:从大到小

说明

新手第一坑:ranked = scores.sort() —— ranked 会是 None!.sort() 干完活不交货(它改的是原列表)。要"接住结果"就用 sorted()。记法:sorted 有 ed,是"排好的"副本;.sort() 是命令,让它自己排

排字符串也一样顺手,默认按字母表:

Python

key= 是排序的"评分标准":默认拿元素本身比大小,指定 key=len 就改成拿长度比。往 key 里塞自己写的评分函数,等到本单元"函数进阶"课再解锁——现在会用 lenstr.lower 这两个现成的就够。

三、列表推导式:一行造新表

营销部拿到一批含税价格,要全部换算成折后价。阶段 0 的写法你会:

prices = [100, 250, 80, 400]
discounted = []
for p in prices:            # 建空表 → 遍历 → 加工 → append,四步
    discounted.append(p * 0.8)

列表推导式把这四步压成一行:

Python

读法有窍门——从 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 循环更清楚。一行读得懂就用,读不懂就展开——代码是写给三个月后的自己看的。

组合拳:三件套连招

真实需求往往是连招。行政小美统计部门团建报名费,想要"报名费从高到低的前三名":

Python

第二个例子值得多看一眼:n.strip() 去首尾空格(阶段 0 的老朋友),if 把洗完还是空串的条目拦在门外——清洗数据这个动作,你在阶段 1 后半段的 pandas 课里会天天做,这就是它的迷你版。

✍️ 练习

练习 1:一周的中间三天

用切片从 7 天访问量里取出周三到周五(下标 2、3、4)这三天的数据,打印出来。

Python
✅ 参考答案
visits = [820, 930, 1150, 1080, 1240, 660, 590]

mid = visits[2:5]   # 含头不含尾:下标 2、3、4
print(mid)

练习 2:畅销榜前三

先把销量从大到小排好(不许改动原列表 sales),再切出前三名打印。

Python
💡 提示

"不许改原列表"是在提示你选 sorted() 还是 .sort()。排好之后就是练习 1 的切片。两步可以并成一行。

✅ 参考答案
sales = [180, 95, 260, 140, 320, 75]

top3 = sorted(sales, reverse=True)[:3]
print(top3)
print(sales)   # 验证原列表没变

练习 3:邮箱清洗流水线(挑战)

一个列表推导式完成:把列表里的邮箱全部转小写(.lower()),并且只保留含 "@" 的合法条目。

Python
💡 提示

套结构 [加工 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)

📝 随堂测验

随堂测验0 / 5 题正确

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 返回数据的直觉地基。

划选正文任意文字可高亮、批注或加入复习卡

讨论

载入中…