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. 常见应用场景


❓ 常见问题

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]
Qremove() 删除不存在的元素会怎样?
A 会报 ValueError。所以删除前最好先用 in 判断一下元素是否存在:if "xxx" in my_list: my_list.remove("xxx")。或者用列表推导式创建新列表来过滤:new_list = [x for x in my_list if x != "xxx"](下一课会学)。

📖 小节


📝 作业

  1. 基础题(难度⭐):创建一个包含 5 个你喜欢的电影的列表。用 append() 添加一部新电影,用 pop() 删除最后一部,用 sort() 按字母排序,最后输出列表长度。

  2. 进阶题(难度⭐⭐):给定一个数字列表 numbers = [23, 45, 12, 67, 34, 89, 5, 18],分别找出并输出最大值、最小值、总和、平均值。提示:可以用 max()min()sum()len() 等内置函数。

  3. 挑战题(难度⭐⭐⭐):写一个"待办事项管理器"。用列表存储任务,支持以下操作:添加任务 add:买牛奶、完成删除 done:2(按编号删除)、列出所有任务 list。用 while True 循环持续接收命令,输入 exit 退出。提示:用 split(":") 解析命令。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏