同学你好!👋 欢迎回到 Python 课堂。我是你的老师。
上节课我们学习了字符串,今天我们要迎来 Python 中最强大、最常用的数据结构——列表(List)。
如果把字符串比作一串固定的珍珠项链,那么列表就像一个“魔法收纳箱”。你可以往里面装任何东西(数字、字符串、甚至其他列表),而且可以随时往里面加东西、拿东西、或者改变里面的东西。
为了让你彻底掌握它,我将这篇教程的精华提炼为5 个核心模块,并为你准备了丰富的实战案例和避坑指南。打开你的代码编辑器,我们开始吧!
📦 第一模块:列表的“诞生”(创建与特点)
列表用方括号[]表示,元素之间用逗号,分隔。
🌟 老师划重点:列表中的元素不需要是相同类型!这是它和很多其他语言数组最大的不同。
💡 案例:
# 1. 包含不同类型的“大杂烩”列表magic_box=["苹果",100,3.14,True,[1,2,3]]print(magic_box)# 2. 空列表(当你需要后续往里面添加数据时)empty_list=[]# 或者使用内置函数another_empty=list()🔍 第二模块:列表的“寻物指南”(索引、切片与查)
列表和字符串一样,都是序列,所以它们共享相同的索引和切片规则。
- 正向索引:从
0开始。 - 反向索引:从
-1开始(-1代表最后一个元素)。 - 成员检查:使用
in关键字。
💡 案例:
fruits=["苹果","香蕉","樱桃","葡萄","西瓜"]# 1. 索引访问print(fruits[0])# 输出: 苹果print(fruits[-1])# 输出: 西瓜 (倒数第一个)# 2. 切片访问 (左闭右开)print(fruits[1:3])# 输出: ['香蕉', '樱桃'] (取索引 1 和 2)print(fruits[2:])# 输出: ['樱桃', '葡萄', '西瓜'] (从索引 2 到末尾)print(fruits[::-1])# 输出: ['西瓜', '葡萄', '樱桃', '香蕉', '苹果'] (列表反转)# 3. 检查元素是否存在print("香蕉"infruits)# 输出: Trueprint("橘子"infruits)# 输出: False🛠️ 第三模块:列表的“增删改”(核心操作)🌟重中之重
这是列表最常用的操作,老师为你分类整理,请仔细对比它们的区别:
1. 增加元素 (Add)
append(x): 在列表末尾添加一个元素。extend(iterable): 在列表末尾一次性追加多个元素(把另一个序列“拆开”加进来)。insert(i, x): 在指定索引i的位置插入元素x。
💡 案例:
nums=[1,2,3]nums.append(4)print(nums)# 输出: [1, 2, 3, 4]nums.extend([5,6])# 注意:传入的是一个列表print(nums)# 输出: [1, 2, 3, 4, 5, 6]nums.insert(0,99)# 在索引 0 的位置插入 99print(nums)# 输出: [99, 1, 2, 3, 4, 5, 6]2. 删除元素 (Remove)
remove(x): 删除列表中第一个匹配的值x。(如果找不到会报错!)pop([i]): 移除并返回指定索引i的元素。如果不写索引,默认移除并返回最后一个元素。(像弹夹弹出子弹一样)。del: Python 的语句,可以按索引删除,也可以删除整个列表变量。clear(): 清空列表,保留空壳[]。
💡 案例:
colors=["红","绿","蓝","绿","黄"]# 1. remove: 按值删除 (只删第一个遇到的)colors.remove("绿")print(colors)# 输出: ['红', '蓝', '绿', '黄']# 2. pop: 按索引删除,并拿到被删的值last_color=colors.pop()# 默认弹出最后一个print(last_color)# 输出: 黄print(colors)# 输出: ['红', '蓝', '绿']first_color=colors.pop(0)# 弹出索引 0 的元素print(first_color)# 输出: 红# 3. del: 按索引删除delcolors[0]print(colors)# 输出: ['蓝']3. 修改元素 (Update)
直接通过索引重新赋值即可(因为列表是可变的,这和字符串不同)。
scores=[80,90,70]scores[1]=95# 把 90 改成 95print(scores)# 输出: [80, 95, 70]🪄 第四模块:列表的“高级魔法”(常用内置方法与函数)
1. 排序与反转
sort(): 对原列表进行就地排序(默认升序)。会改变原列表!reverse(): 将原列表就地反转。
💡 案例:
numbers=[4,1,9,3]# 升序排序numbers.sort()print(numbers)# 输出: [1, 3, 4, 9]# 降序排序 (使用 reverse=True 参数)numbers.sort(reverse=True)print(numbers)# 输出: [9, 4, 3, 1]# 反转numbers.reverse()print(numbers)# 输出: [1, 3, 4, 9](老师提示:如果不想改变原列表,想得到一个排好序的新列表,可以使用sorted(numbers)函数)
2. 统计与查找
count(x): 统计元素x在列表中出现的次数。index(x): 返回元素x第一次出现的索引。(找不到会报错!)
💡 案例:
letters=['a','b','a','c','a']print(letters.count('a'))# 输出: 3print(letters.index('c'))# 输出: 33. 常用全局函数
len(list): 获取列表长度(元素个数)。max(list)/min(list): 获取最大值/最小值(元素必须是可比较的同类型,如全是数字)。
⚠️ 第五模块:老师的“避坑指南”(考试/实战必考!)
🚫 坑点 1:append和extend的混淆
这是新手最容易犯的错误。
list_a=[1,2]list_b=[3,4]list_a.append(list_b)print(list_a)# 输出: [1, 2, [3, 4]] <-- 把整个列表当成了一个元素塞进去!list_c=[1,2]list_c.extend(list_b)print(list_c)# 输出: [1, 2, 3, 4] <-- 把元素拆开,合并进来!(这才是你想要的)🚫 坑点 2:列表的“影子克隆”(浅拷贝陷阱)
在 Python 中,=赋值不会创建新列表,它只是给原来的列表贴了一个“新标签”(别名)。修改其中一个,另一个也会变!
original=[1,2,3]fake_copy=original# ❌ 错误做法:这只是起了个别名fake_copy[0]=99print(original)# 输出: [99, 2, 3] (原列表被意外修改了!)# ✅ 正确做法 1:使用 copy() 方法real_copy=original.copy()real_copy[1]=88print(original)# 输出: [99, 2, 3] (原列表安全了)# ✅ 正确做法 2:使用切片 (Pythonic 写法)another_copy=original[:]🚫 坑点 3:在遍历列表时直接删除元素
这会导致索引错乱,漏掉元素或报错。
# ❌ 危险操作:nums=[1,2,2,3]forninnums:ifn==2:nums.remove(n)# 可能会导致跳过某些元素# ✅ 安全操作:遍历它的副本,或者使用列表推导式(后续课程会学)forninnums[:]:# 加上 [:] 遍历副本ifn==2:nums.remove(n)📝 老师的课后小测验
光看不练假把式,请在你的 Python 环境中尝试解决以下 3 个问题:
- 基础操作:创建一个列表
animals = ["猫", "狗", "兔子"]。请在“狗”和“兔子”之间插入“仓鼠”,然后将列表反转,最后打印出来。 - 方法辨析:有列表
A = [1, 2]和B = [3, 4]。执行A.append(B)后,len(A)的值是多少?执行A.extend(B)后,len(A)的值又是多少? - 实战场景:有一个成绩列表
scores = [85, 92, 78, 92, 60]。请编写代码:去掉一个最低分,去掉一个最高分,然后计算剩余分数的平均值。(提示:使用remove,max,min,sum,len)
同学,列表是 Python 编程的基石,后续的字典、元组以及数据处理(如 Pandas)都建立在熟练掌握列表的基础上。
你可以先自己尝试写出这 3 道题的代码。如果有任何疑惑,或者运行代码时遇到了报错(比如IndexError或ValueError),随时把代码发给我,老师会帮你一行行分析 debug!
今天表现得很棒,继续加油!💪 还有什么不清楚的吗?