查看全课大纲(第 14 / 51 节)
- 1.Python 是什么?为什么值得学?
- 2.如何为 Python 编程准备一个“全家桶”环境?
- 3.Python 有哪几种执行方法?
- 4.行与缩进到底有什么用?
- 5.注释有什么用,怎么写?
- 6.变量:如何给数据起个好名字?
- 7.运算符的优先级和常见坑点是什么?
- 8.Python 中,数字和布尔值究竟有哪几种?
- 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
- 10.如何将程序的结果展示给用户或保存下来?
- 11.CSV 文件怎么读怎么写才方便?
- 12.列表是什么,如何创建和访问它?
- 13.列表的修改操作,有哪些方法?
- 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
- 15.判断语句:如何让程序根据条件做不同的事?
- 16.for 循环如何遍历序列中的元素?
- 17.while 循环什么时候才会停?
- 18.while 循环的结束条件,你写对了吗?
- 19.循环中途想提前结束,怎么办?
- 20.`break` 和 `continue` 到底有什么区别?
- 21.列表推导式如何让代码更简洁高效?
- 22.字符串怎么定义、拼接和操作?
- 23.元组:为什么定义单个元素时要加逗号?
- 24.集合(set)怎么用?如何快速去重和做集合运算?
- 25.字典是什么,为什么比列表更方便?
- 26.字典的增删改查与遍历,如何避免 KeyError?
- 27.函数里的变量,为什么有的能用有的不能用?
- 28.在函数内部修改全局变量,为什么有时不生效?
- 29.函数里能修改全局变量吗?返回值怎么用?
- 30.匿名函数:如何用 lambda 快速定义简单函数?
- 31.面向对象编程是什么,为什么需要它?
- 32.类中的方法和属性到底怎么定义和使用?
- 33.如何控制对对象内部属性和方法的访问?
- 34.异常发生时,程序会怎样继续执行?
- 35.如何组织代码:包和模块
- 36.`if __name__ == '__main__'` 到底有什么用?
- 37.如何用 IDE 的 Debug 功能排查程序错误?
- 38.Matplotlib 绘图的第一步该做什么?
- 39.Figure 是什么,如何设置图形尺寸?
- 40.如何自定义 Matplotlib 的坐标轴?
- 41.如何为图表添加图例,让不同曲线一目了然?
- 42.饼图怎么画才能直观展示数据占比?
- 43.如何用 Matplotlib 绘制散点图?
- 44.柱状图怎么画?
- 45.如何使用 Matplotlib 绘制等高线图?
- 46.如何在 Matplotlib 中绘制子图?
- 47.zip 函数如何把多个列表“打包”在一起?
- 48.如何给可迭代对象加上索引?
- 49.random 模块如何生成随机数?
- 50.math 模块怎么用?
- 51.Counter 如何快速统计元素出现次数?
列表切片为什么能取到部分元素?排序和查找又该怎么用?
约 14 分钟
小象实战讲义 · Python 编程从入门到实践
在前面的课时中,我们学习了列表的基本创建和元素访问,知道了如何获取单个元素。但在实际编程中,我们经常需要处理列表的一部分,比如“取前三个”、“取偶数位”或者“倒过来看”。本节将学习列表的切片操作,它能让你轻松截取列表的任意一段。同时,我们还会学习如何判断元素是否在列表中,以及如何对列表进行排序、反转和计数。这些操作是处理数据集合的基础。
💡 核心导读
- 切片:使用
[start:end:step]语法截取列表的子集,理解“左闭右开”原则和负数索引。 - 成员判断:使用
in和not in关键字快速检查元素是否存在于列表中。 - 排序与反转:使用
.sort()对列表本身进行排序,使用.reverse()反转列表顺序。 - 计数:使用
.count()统计列表中特定元素出现的次数。 - 关键区别:
.sort()会修改原列表,而切片等操作通常返回一个新列表。
什么是列表切片?
切片(Slicing)是一种通过指定开始位置、结束位置和步长来获取列表中部分元素的操作。其基本语法是 列表变量[开始:结束:步长]。这三个参数都可以省略。
核心规则:
- 索引从0开始:列表中第一个元素的位置(索引)是0。
- 左闭右开:切片区间包含“开始”索引对应的元素,但不包含“结束”索引对应的元素。
- 负数索引:
-1表示最后一个元素,-2表示倒数第二个,依此类推。 - 步长:默认为1,表示逐个取元素;为2表示隔一个取一个;负数表示从右向左取。
基本切片与步长
下面把基本切片和步长放在同一个示例中演示。步长是切片的第三个参数,用第二个冒号分隔。
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("原始列表:", my_list)
# 1. 取从索引1(元素2)开始到列表末尾的所有元素
print("list[1:]:", my_list[1:])
# 2. 取从列表开头开始,到索引8(元素9)结束,但不包含索引8
print("list[:8]:", my_list[:8])
# 3. 取从索引3(元素4)开始,到索引5(元素6)结束,但不包含索引5
print("list[3:5]:", my_list[3:5])
# 4. 使用负数索引:取最后两个元素
print("list[-2:]:", my_list[-2:])
# 5. 开始位置(-2)在结束位置(-3)的右边,得到空列表
print("list[-2:-3]:", my_list[-2:-3])
# 6. 步长为2:取所有值为奇数的元素(索引0,2,4...)
print("list[::2]:", my_list[::2])
# 7. 从索引1到索引8,步长为2(取索引1,3,5,7的元素)
print("list[1:8:2]:", my_list[1:8:2])
# 8. 步长为负数:从最后一个元素开始,向左每隔一个取一个
print("list[-1::-2]:", my_list[-1::-2])原始列表: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list[1:]: [2, 3, 4, 5, 6, 7, 8, 9, 10]
list[:8]: [1, 2, 3, 4, 5, 6, 7, 8]
list[3:5]: [4, 5]
list[-2:]: [9, 10]
list[-2:-3]: []
list[::2]: [1, 3, 5, 7, 9]
list[1:8:2]: [2, 4, 6, 8]
list[-1::-2]: [10, 8, 6, 4, 2]如何判断元素是否在列表中?(in / not in)
我们可以使用 in 和 not in 关键字来检查某个元素是否存在于列表中。这是一个非常高效且常用的操作,返回布尔值(True 或 False)。
# 定义一个团队列表
group = ["唐僧", "悟空", "八戒", "沙僧", "白龙马", "白骨精"]
# 判断"白骨精"是否在团队中
if "白骨精" in group:
print("猴哥快来!")
# 判断"悟空"是否不在团队中
if "悟空" not in group:
pass # 该分支不会执行:悟空在团队中
else:
print("老孙来也,妖怪哪里跑!")猴哥快来!
老孙来也,妖怪哪里跑!如何对列表排序和反转?
使用 .sort() 排序
.sort() 方法会直接修改原列表,将其中的元素按顺序排列。
- 默认按升序排列(从小到大)。
- 通过参数
reverse=True可以改为降序排列(从大到小)。
使用 .reverse() 反转
.reverse() 方法会将列表中的元素顺序完全颠倒过来,它也会直接修改原列表。
num_list = [6, 2, 8, 13, 97]
print("排序前:", num_list)
num_list.sort() # 默认升序
print("升序后:", num_list)
num_list.sort(reverse=True) # 降序排列
print("降序后:", num_list)
# reverse() 直接反转原列表
num_list = [1, 2, 8, 1, 5, 1, 13, 97]
print("反转前:", num_list)
num_list.reverse()
print("反转后:", num_list)排序前: [6, 2, 8, 13, 97]
升序后: [2, 6, 8, 13, 97]
降序后: [97, 13, 8, 6, 2]
反转前: [1, 2, 8, 1, 5, 1, 13, 97]
反转后: [97, 13, 1, 5, 1, 8, 2, 1]如何统计列表中元素的出现次数?
使用 .count(元素) 方法可以统计指定元素在列表中出现的次数。如果元素不存在,则返回 0。
num_list = [1, 2, 8, 1, 5, 1, 13, 97]
# 统计数字 1 出现的次数
count_of_1 = num_list.count(1)
print("数字 1 出现了 {} 次".format(count_of_1))
# 统计数字 97 出现的次数
count_of_97 = num_list.count(97)
print("数字 97 出现了 {} 次".format(count_of_97))
# 统计一个不存在的数字
count_of_100 = num_list.count(100)
print("数字 100 出现了 {} 次".format(count_of_100))数字 1 出现了 3 次
数字 97 出现了 1 次
数字 100 出现了 0 次📝 动手练一练
- 有一个列表
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],请使用切片完成以下操作:- 取出第3到第6个元素(即 30, 40, 50, 60)。
- 取出最后三个元素。
- 取出所有索引为奇数的元素(即 20, 40, 60, 80, 100)。
- 将列表倒序输出。
👉 点击查看参考答案
思路:明确索引位置(从0开始),利用切片语法 [start:end:step] 和负数索引。
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
# 1. 第3到第6个元素:索引2到6(左闭右开)
print("第3到第6个元素:", data[2:6])
# 2. 最后三个元素:使用负数索引
print("最后三个元素:", data[-3:])
# 3. 索引为奇数的元素:从索引1开始,步长为2
print("索引为奇数的元素:", data[1::2])
# 4. 列表倒序:开始和结束省略,步长为-1
print("列表倒序:", data[::-1])第3到第6个元素: [30, 40, 50, 60]
最后三个元素: [80, 90, 100]
索引为奇数的元素: [20, 40, 60, 80, 100]
列表倒序: [100, 90, 80, 70, 60, 50, 40, 30, 20, 10]常见错误
| 错误写法 | 现象或报错 | 原因 | 正确写法 |
|---|---|---|---|
print(my_list[2:5]) 期望得到索引2到5的4个元素 | 实际只得到3个元素 [3, 4, 5] | 忽略了切片左闭右开的原则。结束索引5对应的元素(第6个)不被包含。 | 理解规则:my_list[2:6] 才能取到索引2,3,4,5的四个元素。 |
my_list[-1:-3] 期望得到最后三个元素 | 得到空列表 [] | 当开始索引(-1)在结束索引(-3)的右侧时,正向步长(默认1)无法取到元素,结果为空。 | 若要取最后三个,应写 my_list[-3:]。若想从右向左取,需指定负步长:my_list[-1:-4:-1]。 |
使用 .sort() 后想保留原列表 | 原列表被修改,无法找回原始顺序。 | .sort() 是原地操作,直接修改原列表,不返回新列表。 | 如果需要保留原列表,可以先复制一份:sorted_list = my_list[:] 然后 sorted_list.sort()。 |
混淆 .reverse() 和 [::-1] | 认为两者完全一样。 | .reverse() 修改原列表。[::-1] 返回一个反转后的新列表,原列表不变。 | 根据是否需要修改原列表来选择方法。 |
小结
- 切片
[start:end:step]用于截取列表子集,遵循“左闭右开”原则,支持负数索引和步长。 in和not in用于快速判断元素是否存在于列表中,返回布尔值。.sort()方法对列表进行原地排序,默认升序,reverse=True可降序。.reverse()方法将列表元素顺序原地反转。.count(x)方法返回元素x在列表中出现的次数。- 注意区分原地修改的方法(如
.sort(),.reverse())和返回新结果的操作(如切片)。
📋 行动清单
- 在Python环境中,将切片示例中的
start,end,step换成不同的值,观察输出结果,加深对“左闭右开”和步长的理解。 - 对一个包含字符串的列表(如
['apple', 'banana', 'cherry'])尝试使用.sort()和.reverse(),看看排序规则。 - 使用
in和.count()在一个混合了多种数据类型的列表中查找特定元素,体会它们的用途。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第1章代码包:列表-切片及排序等(含1 个 Notebook)ZIP · 954B