第 6 章 列表、元组、字典与集合
学习目标
- 掌握列表的增删改查
- 理解元组与列表的区别,会用元组解包
- 掌握字典的键值对操作
- 掌握集合的去重与集合运算
- 会写列表推导式,会用
enumerate、zip等常用内置函数
6.1 列表
列表(list)是有序、可修改的序列,用方括号定义,元素用逗号分隔:
python
fruits = ["苹果", "香蕉", "橘子"]
print(fruits[0]) # 下标访问,和字符串一样从 0 开始
print(len(fruits))输出:
苹果
3列表是可变的,可以原地增删改:
python
fruits = ["苹果", "香蕉"]
fruits.append("橘子") # 末尾追加
print(fruits)
fruits[0] = "西瓜" # 按下标修改
print(fruits)
fruits.pop() # 弹出末尾元素
print(fruits)
fruits.remove("香蕉") # 删除指定元素(第一个匹配项)
print(fruits)输出:
['苹果', '香蕉', '橘子']
['西瓜', '香蕉', '橘子']
['西瓜', '香蕉']
['西瓜']常用操作一览:
| 操作 | 写法 | 说明 |
|---|---|---|
| 追加 | lst.append(x) | 末尾加一个元素 |
| 插入 | lst.insert(i, x) | 在下标 i 处插入 |
| 删除 | lst.remove(x) | 删除第一个值为 x 的元素 |
| 弹出 | lst.pop() | 删除并返回末尾元素 |
| 排序 | lst.sort() | 原地升序排序 |
| 排序(新列表) | sorted(lst) | 返回排好序的新列表 |
| 拼接 | lst1 + lst2 | 生成新列表 |
| 重复 | lst * n | 重复 n 次 |
| 长度 | len(lst) | 元素个数 |
| 包含 | x in lst | 是否包含 |
python
nums = [3, 1, 2]
nums.sort()
print(nums)
print(sorted([3, 1, 2]))
print([1, 2] + [3])
print([0] * 3)输出:
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[0, 0, 0]注意 sort() 会改变原列表,sorted() 返回新列表、原列表不变。
6.2 元组
元组(tuple)是有序、不可修改的序列,用圆括号定义。它和列表的区别只有一个:创建后不能增删改。
python
point = (3, 5)
print(point[0])
point[0] = 10 # 报错:TypeError: 'tuple' object does not support item assignment元组适合保存「不该被修改」的固定数据,如坐标、日期、配置项。
元组支持解包:把元组里的值一次性赋给多个变量:
python
point = (3, 5)
x, y = point
print(x, y)输出:
3 5利用解包可以一行交换两个变量:
python
a, b = 1, 2
a, b = b, a
print(a, b)输出:
2 16.3 字典
字典(dict)保存键值对的映射,用花括号定义,键: 值 之间用冒号。通过键快速取值,就像查字典一样:
python
student = {"name": "小明", "age": 18}
print(student["name"])输出:
小明增删改查:
python
student = {"name": "小明", "age": 18}
student["age"] = 19 # 修改已有键的值
student["city"] = "上海" # 新增键值对
del student["city"] # 删除键值对
print(student)
print(student.get("sex", "未知")) # 键不存在时返回默认值输出:
{'name': '小明', 'age': 19}
未知用 [] 访问不存在的键会报 KeyError;用 get(key, 默认值) 则安全返回默认值,日常推荐 get。
遍历字典的三种方式:
python
student = {"name": "小明", "age": 18}
for key in student:
print(key, student[key])
for value in student.values():
print(value)
for key, value in student.items():
print(key, value)输出:
name 小明
age 18
小明
18
name 小明
age 186.4 集合
集合(set)是无序、不重复的元素集,用花括号定义。它的两个主要用途:去重、集合运算。
python
nums = [1, 2, 2, 3, 3, 3]
unique = set(nums)
print(unique)输出:
{1, 2, 3}集合运算:| 并集、& 交集、- 差集:
python
a = {1, 2, 3}
b = {3, 4}
print(a | b)
print(a & b)
print(a - b)输出:
{1, 2, 3, 4}
{3}
{1, 2}注意:集合是无序的,print({1, 2, 3}) 可能显示成其他顺序;集合不能按下标访问。
6.5 推导式
推导式用一行表达式生成序列,格式为「对每个元素执行表达式,可选加条件过滤」。
列表推导式:
python
squares = [i * i for i in range(5)]
print(squares)
evens = [i for i in range(10) if i % 2 == 0]
print(evens)输出:
[0, 1, 4, 9, 16]
[0, 2, 4, 6, 8]字典推导式:
python
squares = {i: i * i for i in range(1, 4)}
print(squares)输出:
{1: 1, 2: 4, 3: 9}推导式是列表、字典、集合三者的通用写法,能让「生成序列 + 过滤」的代码更紧凑。读不懂时,展开成普通 for 循环即可,二者完全等价。
6.6 常用内置函数
| 函数 | 作用 | 示例 | 结果 |
|---|---|---|---|
len(x) | 长度 | len([1, 2, 3]) | 3 |
sum(x) | 求和 | sum([1, 2, 3]) | 6 |
max(x) / min(x) | 最大 / 最小 | max([1, 2, 3]) | 3 |
sorted(x) | 排序(新列表) | sorted([3, 1, 2]) | [1, 2, 3] |
enumerate(x) | 带下标遍历 | list(enumerate(["a", "b"])) | [(0, "a"), (1, "b")] |
zip(a, b) | 按位配对 | list(zip([1, 2], [3, 4])) | [(1, 3), (2, 4)] |
enumerate 的典型用法:循环时同时拿到下标和元素:
python
fruits = ["苹果", "香蕉"]
for i, fruit in enumerate(fruits):
print(i, fruit)输出:
0 苹果
1 香蕉动手实践
任务:成绩统计。 读入用逗号分隔的成绩,输出:平均分、最高分、最低分、及格(≥60)人数。
python
text = input("请输入成绩,用逗号分隔: ")
scores = [int(x) for x in text.split(",")]
print(f"平均分: {sum(scores) / len(scores)}")
print(f"最高分: {max(scores)}")
print(f"最低分: {min(scores)}")
passed = [s for s in scores if s >= 60]
print(f"及格人数: {len(passed)}")运行示例(输入 85,92,78,90,66):
请输入成绩,用逗号分隔: 85,92,78,90,66
平均分: 82.2
最高分: 92
最低分: 66
及格人数: 5常见错误
| 错误写法 | 报错信息 | 原因 |
|---|---|---|
[1, 2][5] | IndexError: list index out of range | 下标超出范围 |
t = (1, 2); t[0] = 5 | TypeError: 'tuple' object does not support item assignment | 元组不可修改 |
d = {"a": 1}; d["b"] | KeyError: 'b' | 键不存在,用 get 更安全 |
s = {1, 2}; s[0] | TypeError: 'set' object is not subscriptable | 集合无序,不能按下标访问 |
print({1, 2, 3}) 两次顺序不同 | 不报错但顺序不确定 | 集合无序,不要依赖输出顺序 |
章末练习
基础
- 创建列表
[5, 2, 8, 1, 9],输出它的长度、最大值、最小值、排序后的新列表。 - 把列表
[1, 2, 3]与[4, 5]拼接,并输出结果。 - 创建字典
{"语文": 88, "数学": 95},新增"英语": 90,再输出三门课的总分。
提高
- 用列表推导式生成 1 到 20 中所有偶数的平方,输出结果。
- 读入 5 个数字存入列表,去掉重复后输出(提示:
set)。 - 用
enumerate遍历列表["春", "夏", "秋", "冬"],输出0 春、1 夏这样的格式。
挑战
- 有两个列表
names = ["小明", "小红"]和scores = [92, 88],用zip把它们组合成字典{"小明": 92, "小红": 88}并输出。 - 一个列表里混有重复元素,统计每个元素出现的次数,输出字典形式,如
["a", "b", "a"]→{"a": 2, "b": 1}。提示:遍历列表,用字典记录次数。
章末自测
每题选择一个最佳答案。本书不附答案:完成后交由老师或 AI 老师批改讲解。
[1, 2, 3].append(4)后,列表变成?- A.
[1, 2, 3, 4] - B.
[4, 1, 2, 3] - C.
[1, 2, 3] - D.
[1, 2, 3, [4]]
- A.
- 元组与列表最大的区别是?
- A. 元组有序,列表无序
- B. 元组不可修改
- C. 元组不能存数字
- D. 没有区别
t = (1, 2); x, y = t执行后,x的值是?- A.
1 - B.
2 - C.
(1, 2) - D. 报错
- A.
d = {"a": 1}; d["b"]会?- A. 返回
1 - B. 返回
None - C. 报
KeyError - D. 自动创建键
- A. 返回
d.get("b", 0)(d 中无"b"键)返回?- A.
0 - B. 报错
- C.
None - D.
"b"
- A.
set([1, 2, 2, 3])的结果是?- A.
{1, 2, 3} - B.
[1, 2, 3] - C.
{1, 2, 2, 3} - D. 报错
- A.
{1, 2, 3} & {2, 3, 4}的结果是?- A.
{2, 3} - B.
{1, 2, 3, 4} - C.
{1, 4} - D. 报错
- A.
[i * i for i in range(4)]的结果是?- A.
[0, 1, 4, 9] - B.
[1, 4, 9, 16] - C.
[0, 1, 2, 3] - D.
[0, 1, 4, 9, 16]
- A.
list(enumerate(["a", "b"]))的结果是?- A.
[(0, "a"), (1, "b")] - B.
["0a", "1b"] - C.
[("a", 0), ("b", 1)] - D. 报错
- A.
- 下列哪种数据适合用元组保存? A. 待办清单(需要增删) B. 坐标 (3, 5)(不会修改) C. 成绩列表 D. 全部都可以
