Python: 列表基础
前几课我们学的变量只能存一个值,但现实中很少只有一个数据——购物车里有多个商品,排行榜有多条记录,一篇文章有多个段落。列表(list)就是用来存"一堆数据"的东西。它是 Python 中最灵活、最常用的数据结构。
1. 什么是列表
列表用方括号 [] 定义,里面的元素用逗号隔开。可以存放不同类型的元素:
PYTHON
# 整数列表
numbers = [1, 2, 3, 4, 5]
# 字符串列表
fruits = ["苹果", "香蕉", "橘子"]
# 混合类型
mixed = [1, "hello", True, 3.14]
# 空列表
empty = []
print(numbers) # [1, 2, 3, 4, 5]
print(fruits) # ['苹果', '香蕉', '橘子']
print(empty) # []
💡 列表是有序的——元素按你添加的顺序排列,有固定的位置。和集合不同,列表中的元素可以重复。
2. 索引访问
列表的索引和字符串完全一致——从 0 开始,支持负数索引:
PYTHON
fruits = ["苹果", "香蕉", "橘子", "葡萄", "西瓜"]
# 正索引:从 0 开始
print(fruits[0]) # 苹果
print(fruits[2]) # 橘子
print(fruits[4]) # 西瓜
# 负索引:从 -1 开始(倒数)
print(fruits[-1]) # 西瓜
print(fruits[-2]) # 葡萄
print(fruits[-5]) # 苹果
索引超出了范围会报错:
PYTHON
# print(fruits[10]) # IndexError: list index out of range
▶ 示例:获取列表元素信息(难度⭐)
PYTHON
# 给定一个学生列表
students = ["Alice", "Bob", "Charlie", "赵六", "孙七"]
# 第一个和最后一个
first = students[0]
last = students[-1]
print(f"第一个学生:{first}") # Alice
print(f"最后一个学生:{last}") # 孙七
# 前三个
top3 = students[:3] # 切片
print(f"前三名:{top3}") # ['Alice', 'Bob', 'Charlie']
# 列表长度
count = len(students)
print(f"学生总数:{count}") # 5
输出:
TEXT
📖 仅展示
# 执行成功
3. 列表的增删改查
列表是可变的——可以在原列表上直接修改,这和字符串不同。
(1) 添加元素
PYTHON
# append() —— 末尾添加
cities = ["北京", "上海"]
cities.append("广州")
print(cities) # ['北京', '上海', '广州']
# insert() —— 指定位置插入
cities.insert(1, "深圳")
print(cities) # ['北京', '深圳', '上海', '广州']
# extend() —— 合并另一个列表
more_cities = ["杭州", "成都"]
cities.extend(more_cities)
print(cities) # ['北京', '深圳', '上海', '广州', '杭州', '成都']
(2) 删除元素
PYTHON
# pop() —— 删除并返回指定位置的元素(默认最后一个)
cities = ["北京", "上海", "广州", "深圳"]
last = cities.pop() # 删除并返回最后一个
print(f"删除了:{last}") # 深圳
print(cities) # ['北京', '上海', '广州']
first = cities.pop(0) # 删除第一个
print(f"删除了:{first}") # 北京
print(cities) # ['上海', '广州']
# remove() —— 删除第一个匹配的值
cities = ["北京", "上海", "广州", "上海"]
cities.remove("上海") # 只删除第一个"上海"
print(cities) # ['北京', '广州', '上海']
# clear() —— 清空所有元素
cities.clear()
print(cities) # []
(3) 修改元素
PYTHON
scores = [60, 70, 80, 90]
scores[2] = 85 # 把第三个改为 85
print(scores) # [60, 70, 85, 90]
(4) 查找元素
PYTHON
# in —— 判断是否包含
fruits = ["苹果", "香蕉", "橘子"]
print("苹果" in fruits) # True
print("葡萄" in fruits) # False
# index() —— 查找位置
print(fruits.index("香蕉")) # 1
# print(fruits.index("葡萄")) # ValueError!
⚠️ 注意: 用
index() 查找不存在的元素会报错。先用 in 判断一下再查,更安全。
▶ 示例:购物车管理(难度⭐⭐)
PYTHON
# 用列表模拟购物车
cart = []
# 添加商品
cart.append("苹果")
cart.append("牛奶")
cart.append("面包")
cart.append("苹果") # 可以重复
print(f"购物车:{cart}")
# 查看数量
print(f"商品总数:{len(cart)}")
# 修改数量——把第一个苹果改成"苹果(2个)"
cart[0] = "苹果(2个)"
print(f"修改后:{cart}")
# 删除最后一个商品
removed = cart.pop()
print(f"删除了:{removed}")
print(f"最终购物车:{cart}")
运行结果:
TEXT
📖 仅展示
购物车:['苹果', '牛奶', '面包', '苹果']
商品总数:4
修改后:['苹果(2个)', '牛奶', '面包', '苹果']
删除了:苹果
最终购物车:['苹果(2个)', '牛奶', '面包']
4. 列表排序与反转
PYTHON
numbers = [3, 1, 4, 1, 5, 9, 2]
# sort() —— 原地排序(会修改原列表)
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
# sort(reverse=True) —— 降序
numbers.sort(reverse=True)
print(numbers) # [9, 5, 4, 3, 2, 1, 1]
# reverse() —— 反转顺序
numbers.reverse()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
# sorted() —— 返回新列表,不修改原列表
numbers = [3, 1, 4, 1, 5]
sorted_nums = sorted(numbers)
print(sorted_nums) # [1, 1, 3, 4, 5]
print(numbers) # [3, 1, 4, 1, 5](没变)
💡
sort() vs sorted() 怎么选? 如果你以后不需要原顺序,用 sort()(更快更省内存)。如果你需要保留原顺序用于其他用途,用 sorted()。
5. 列表切片
切片的用法和字符串一样:列表[起点:终点:步长]
PYTHON
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums[2:6]) # [2, 3, 4, 5]
print(nums[:4]) # [0, 1, 2, 3]——前4个
print(nums[6:]) # [6, 7, 8, 9]——从第6到最后
print(nums[::2]) # [0, 2, 4, 6, 8]——每2取1
print(nums[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]——反转
切片还支持赋值——这是列表特有的能力:
PYTHON
nums = [0, 1, 2, 3, 4, 5]
# 用切片替换一段
nums[1:4] = [10, 20, 30]
print(nums) # [0, 10, 20, 30, 4, 5]
# 用切片删除一段
nums[1:4] = []
print(nums) # [0, 4, 5]
▶ 示例:列表切片应用(难度⭐⭐)
PYTHON
# 分页显示——每页显示 3 条
items = ["商品A", "商品B", "商品C", "商品D", "商品E", "商品F", "商品G"]
page_size = 3
total_pages = (len(items) + page_size - 1) // page_size
for page in range(total_pages):
start = page * page_size
end = start + page_size
page_items = items[start:end]
print(f"第{page + 1}页:{page_items}")
运行结果:
TEXT
📖 仅展示
第1页:['商品A', '商品B', '商品C']
第2页:['商品D', '商品E', '商品F']
第3页:['商品G']
6. 嵌套列表
列表的元素也可以是列表——这叫嵌套列表(也叫二维列表)。
PYTHON
# 3行4列的"矩阵"
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
# 访问元素:先取行,再取列
print(matrix[0]) # [1, 2, 3, 4]——第一行
print(matrix[1][2]) # 7——第二行第三列
print(matrix[2][0]) # 9——第三行第一列
▶ 示例:学生成绩表(难度⭐⭐⭐)
PYTHON
# 用嵌套列表存储学生成绩
# 每行:[姓名, 语文, 数学, 英语]
scores = [
["Alice", 85, 92, 78],
["Bob", 90, 88, 95],
["Charlie", 76, 85, 82],
]
# 输出每个学生的平均分
for student in scores:
name = student[0]
avg = (student[1] + student[2] + student[3]) / 3
print(f"{name}:平均分 {avg:.1f}")
# 输出所有数学成绩
print("数学成绩:")
for student in scores:
print(f" {student[0]}:{student[1]}")
运行结果:
TEXT
📖 仅展示
Alice:平均分 85.0
Bob:平均分 91.0
Charlie:平均分 81.0
数学成绩:
Alice:85
Bob:90
Charlie:76
7. 常见应用场景
- 待办事项列表:用
append()添加任务,pop()完成删除,sort()按优先级排序。 - 队列:先进先出——用
append()入队,pop(0)出队。 - 数据收集:循环中用
append()收集结果,最后统一分析。 - 分页显示:用切片
list[start:end]实现数据分页。 - 矩阵运算:二维列表存储表格数据,行和列索引访问。
❓ 常见问题
Q 列表和字符串有什么区别?
A 最大的区别是列表可变的(可以增删改),字符串不可变的(不能修改原字符串)。列表可以放不同类型的数据,字符串只能放字符。共同点是都支持索引、切片、
len()、in 操作。Q
append() 和 extend() 有什么区别?A
append() 把整个参数当成一个元素添加——如果你传一个列表,它会变成嵌套列表。extend() 会把参数中的每个元素逐一添加。a = [1,2]; a.append([3,4]) 结果是 [1,2,[3,4]],而 a.extend([3,4]) 结果是 [1,2,3,4]。Q 用
remove() 删除不存在的元素会怎样?A 会报
ValueError。所以删除前最好先用 in 判断一下元素是否存在:if "xxx" in my_list: my_list.remove("xxx")。或者用列表推导式创建新列表来过滤:new_list = [x for x in my_list if x != "xxx"](下一课会学)。📖 小节
- 列表用
[]定义,有序、可变、可重复,可以存不同类型的数据 - 索引从 0 开始,支持负数索引,切片用法和字符串相同
- 增:
append()末尾添加、insert()指定位置、extend()合并列表 - 删:
pop()删除并返回、remove()按值删除、clear()全部清空 - 改:直接用
列表[索引] = 新值 - 查:
in判断是否存在、index()查找位置 - 排序:
sort()原地排序、sorted()返回新列表 - 嵌套列表可以实现二维数据结构,通过
列表[行][列]访问
📝 作业
-
基础题(难度⭐):创建一个包含 5 个你喜欢的电影的列表。用
append()添加一部新电影,用pop()删除最后一部,用sort()按字母排序,最后输出列表长度。 -
进阶题(难度⭐⭐):给定一个数字列表
numbers = [23, 45, 12, 67, 34, 89, 5, 18],分别找出并输出最大值、最小值、总和、平均值。提示:可以用max()、min()、sum()、len()等内置函数。 -
挑战题(难度⭐⭐⭐):写一个"待办事项管理器"。用列表存储任务,支持以下操作:添加任务
add:买牛奶、完成删除done:2(按编号删除)、列出所有任务list。用while True循环持续接收命令,输入exit退出。提示:用split(":")解析命令。