Skip to content

第 6 章 列表、元组、字典与集合

学习目标

  • 掌握列表的增删改查
  • 理解元组与列表的区别,会用元组解包
  • 掌握字典的键值对操作
  • 掌握集合的去重与集合运算
  • 会写列表推导式,会用 enumeratezip 等常用内置函数

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 1

6.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 18

6.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] = 5TypeError: '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}) 两次顺序不同不报错但顺序不确定集合无序,不要依赖输出顺序

章末练习

基础

  1. 创建列表 [5, 2, 8, 1, 9],输出它的长度、最大值、最小值、排序后的新列表。
  2. 把列表 [1, 2, 3][4, 5] 拼接,并输出结果。
  3. 创建字典 {"语文": 88, "数学": 95},新增 "英语": 90,再输出三门课的总分。

提高

  1. 用列表推导式生成 1 到 20 中所有偶数的平方,输出结果。
  2. 读入 5 个数字存入列表,去掉重复后输出(提示:set)。
  3. enumerate 遍历列表 ["春", "夏", "秋", "冬"],输出 0 春1 夏 这样的格式。

挑战

  1. 有两个列表 names = ["小明", "小红"]scores = [92, 88],用 zip 把它们组合成字典 {"小明": 92, "小红": 88} 并输出。
  2. 一个列表里混有重复元素,统计每个元素出现的次数,输出字典形式,如 ["a", "b", "a"]{"a": 2, "b": 1}。提示:遍历列表,用字典记录次数。

章末自测

每题选择一个最佳答案。本书不附答案:完成后交由老师或 AI 老师批改讲解。

  1. [1, 2, 3].append(4) 后,列表变成?
    • A. [1, 2, 3, 4]
    • B. [4, 1, 2, 3]
    • C. [1, 2, 3]
    • D. [1, 2, 3, [4]]
  2. 元组与列表最大的区别是?
    • A. 元组有序,列表无序
    • B. 元组不可修改
    • C. 元组不能存数字
    • D. 没有区别
  3. t = (1, 2); x, y = t 执行后,x 的值是?
    • A. 1
    • B. 2
    • C. (1, 2)
    • D. 报错
  4. d = {"a": 1}; d["b"] 会?
    • A. 返回 1
    • B. 返回 None
    • C. 报 KeyError
    • D. 自动创建键
  5. d.get("b", 0)(d 中无 "b" 键)返回?
    • A. 0
    • B. 报错
    • C. None
    • D. "b"
  6. set([1, 2, 2, 3]) 的结果是?
    • A. {1, 2, 3}
    • B. [1, 2, 3]
    • C. {1, 2, 2, 3}
    • D. 报错
  7. {1, 2, 3} & {2, 3, 4} 的结果是?
    • A. {2, 3}
    • B. {1, 2, 3, 4}
    • C. {1, 4}
    • D. 报错
  8. [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]
  9. list(enumerate(["a", "b"])) 的结果是?
    • A. [(0, "a"), (1, "b")]
    • B. ["0a", "1b"]
    • C. [("a", 0), ("b", 1)]
    • D. 报错
  10. 下列哪种数据适合用元组保存? A. 待办清单(需要增删) B. 坐标 (3, 5)(不会修改) C. 成绩列表 D. 全部都可以