Python(二十一) 中的字典
一、什么是字典
字典,英文叫 dictionary,简称 dict。
在 Python 中,字典是一种用来保存“键值对”的数据结构。
通俗地说:
字典就像现实生活中的通讯录。
通过一个名字,可以找到对应的电话号码。
例如:
姓名:小明
年龄:18
城市:北京
写成 Python 字典:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
这里:
"name" 是键,"小明" 是值
"age" 是键,18 是值
"city" 是键,"北京" 是值
字典适合保存一组有对应关系的数据。
例如:
学生信息
商品信息
用户资料
配置项
统计结果
二、什么是键值对
字典中的每一项都由两部分组成:
键 key
值 value
格式:
键: 值
示例:
student = {
"name": "小明",
"age": 18
}
其中:
"name": "小明" 是一个键值对
"age": 18 是一个键值对
可以这样理解:
键负责查找。
值负责保存真正的数据。
就像查字典:
通过“词语”找到“解释”。
通过“键”找到“值”。
三、创建字典
1. 创建普通字典
student = {
"name": "小明",
"age": 18,
"score": 95
}
print(student)
输出结果:
{'name': '小明', 'age': 18, 'score': 95}
2. 创建空字典
空字典表示暂时没有任何键值对。
student = {}
print(student)
输出结果:
{}
空字典常用于后面逐步添加数据。
3. 使用 dict() 创建字典
student = dict(name="小明", age=18)
print(student)
输出结果:
{'name': '小明', 'age': 18}
注意:
使用 dict(name="小明") 这种写法时,键名不需要加引号。
但这种键名必须符合变量命名规则。
4. 由列表创建字典
pairs = [("name", "小明"), ("age", 18)]
student = dict(pairs)
print(student)
输出结果:
{'name': '小明', 'age': 18}
这种写法初学阶段了解即可。
四、字典的基本特点
Python 字典有几个重要特点:
1. 字典使用大括号 {}
2. 字典中的数据是键值对
3. 键不能重复
4. 键通常使用字符串,也可以使用数字、元组等不可变类型
5. 值可以是任意类型
6. 字典可以修改
示例:
student = {
"name": "小明",
"age": 18,
"scores": [90, 85, 100]
}
这里:
"name" 的值是字符串
"age" 的值是整数
"scores" 的值是列表
五、键不能重复
字典中的键必须是唯一的。
如果写了重复的键,后面的值会覆盖前面的值。
示例:
student = {
"name": "小明",
"name": "小红"
}
print(student)
输出结果:
{'name': '小红'}
原因:
两个键都叫 "name"。
后面的 "小红" 覆盖了前面的 "小明"。
教学提醒:
字典中的键就像每个抽屉的标签。
同一个字典里,不应该有两个完全相同的标签。
六、键必须是不可变类型
字典的键必须是不可变类型。
常见可以作为键的类型:
字符串 str
整数 int
浮点数 float
布尔值 bool
元组 tuple
最常用的是字符串。
示例:
student = {
"name": "小明",
"age": 18
}
列表不能作为字典的键。
错误示例:
data = {
["name"]: "小明"
}
这会报错。
原因:
列表是可变对象,不能作为字典的键。
初学阶段可以先记住:
字典的键最常用字符串。
不要用列表当键。
七、通过键获取值
字典不是通过位置索引获取数据,而是通过键获取数据。
格式:
字典[键]
示例:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
print(student["name"])
print(student["age"])
输出结果:
小明
18
解释:
student["name"] 表示获取键 "name" 对应的值。
student["age"] 表示获取键 "age" 对应的值。
注意:
列表靠索引找元素。
字典靠键找值。
八、访问不存在的键会报错
如果使用 字典[键] 访问不存在的键,会报错。
示例:
student = {
"name": "小明",
"age": 18
}
print(student["city"])
会报错:
KeyError: 'city'
原因:
字典中没有 "city" 这个键。
为了避免报错,可以先判断键是否存在:
student = {
"name": "小明",
"age": 18
}
if "city" in student:
print(student["city"])
else:
print("没有 city 这个键")
更常用的方法是使用 get()。
九、get() 的用法
get() 用于安全地获取字典中的值。
格式:
字典.get(键)
示例:
student = {
"name": "小明",
"age": 18
}
print(student.get("name"))
print(student.get("city"))
输出结果:
小明
None
解释:
如果键存在,get() 返回对应的值。
如果键不存在,get() 默认返回 None,不会报错。
也可以设置默认值:
student = {
"name": "小明",
"age": 18
}
city = student.get("city", "未知城市")
print(city)
输出结果:
未知城市
这里:
如果 "city" 存在,就返回 city 对应的值。
如果 "city" 不存在,就返回 "未知城市"。
教学重点:
字典[键]:键不存在会报错。
字典.get(键):键不存在不会报错,可以给默认值。
十、判断键是否存在
可以使用 in 判断字典中是否有某个键。
示例:
student = {
"name": "小明",
"age": 18
}
if "name" in student:
print("有 name 这个键")
注意:
in 判断的是键,不是值。
示例:
student = {
"name": "小明",
"age": 18
}
print("name" in student)
print("小明" in student)
输出结果:
True
False
因为 "小明" 是值,不是键。
如果要判断某个值是否存在,可以使用:
print("小明" in student.values())
十一、添加键值对
如果给一个不存在的键赋值,就是添加新的键值对。
格式:
字典[新键] = 新值
示例:
student = {
"name": "小明",
"age": 18
}
student["city"] = "北京"
print(student)
输出结果:
{'name': '小明', 'age': 18, 'city': '北京'}
解释:
原来没有 "city" 这个键。
student["city"] = "北京" 就添加了一个新的键值对。
十二、修改字典中的值
如果给一个已经存在的键赋值,就是修改这个键对应的值。
示例:
student = {
"name": "小明",
"age": 18
}
student["age"] = 19
print(student)
输出结果:
{'name': '小明', 'age': 19}
解释:
"age" 原来的值是 18。
重新赋值后变成了 19。
可以这样记:
键不存在:添加。
键已存在:修改。
十三、update() 批量添加或修改
update() 可以一次添加或修改多个键值对。
示例:
student = {
"name": "小明",
"age": 18
}
student.update({
"age": 19,
"city": "北京"
})
print(student)
输出结果:
{'name': '小明', 'age': 19, 'city': '北京'}
解释:
"age" 已经存在,所以被修改为 19。
"city" 不存在,所以被添加进去。
也可以这样写:
student.update(score=95, grade="三年级")
初学阶段掌握第一种字典写法即可。
十四、setdefault() 设置默认值
setdefault() 的作用是:
如果键存在,就返回原来的值。
如果键不存在,就添加这个键,并设置默认值。
示例:
student = {
"name": "小明"
}
age = student.setdefault("age", 18)
print(age)
print(student)
输出结果:
18
{'name': '小明', 'age': 18}
如果键已经存在:
student = {
"name": "小明",
"age": 20
}
age = student.setdefault("age", 18)
print(age)
print(student)
输出结果:
20
{'name': '小明', 'age': 20}
教学提醒:
setdefault() 初学阶段了解即可。
它常用于统计和分组场景。
十五、删除键值对
删除字典内容常见方式有:
pop() 按键删除,并返回被删除的值
del 删除指定键
popitem() 删除最后一个键值对
clear() 清空字典
十六、pop() 按键删除
pop() 会根据键删除对应键值对,并返回被删除的值。
示例:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
age = student.pop("age")
print(age)
print(student)
输出结果:
18
{'name': '小明', 'city': '北京'}
如果删除不存在的键,会报错:
student.pop("score")
可以设置默认值,避免报错:
score = student.pop("score", 0)
print(score)
如果 "score" 不存在,就返回默认值 0。
十七、del 删除指定键
del 也可以删除字典中的键值对。
示例:
student = {
"name": "小明",
"age": 18
}
del student["age"]
print(student)
输出结果:
{'name': '小明'}
注意:
如果删除不存在的键,del 会报错。
安全写法:
student = {
"name": "小明",
"age": 18
}
if "age" in student:
del student["age"]
十八、popitem() 删除最后一个键值对
popitem() 会删除并返回最后一个键值对。
示例:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
item = student.popitem()
print(item)
print(student)
输出结果类似:
('city', '北京')
{'name': '小明', 'age': 18}
注意:
Python 3.7 之后,字典会保持插入顺序。
popitem() 删除最后插入的键值对。
初学阶段只需要知道:
popitem() 会删除一个键值对,并返回它。
十九、clear() 清空字典
clear() 用于清空字典中的所有键值对。
示例:
student = {
"name": "小明",
"age": 18
}
student.clear()
print(student)
输出结果:
{}
注意:
clear() 是清空字典内容,字典变量本身还存在。
二十、字典长度 len()
len() 可以获取字典中键值对的数量。
示例:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
print(len(student))
输出结果:
3
这里表示字典中有 3 个键值对。
判断字典是否为空:
student = {}
if student:
print("字典不是空的")
else:
print("字典是空的")
空字典 {} 在条件判断中会被当作 False。
二十一、遍历字典
遍历字典就是把字典中的内容一个一个取出来。
常见遍历方式有:
遍历键
遍历值
遍历键值对
二十二、遍历字典的键
直接遍历字典,默认遍历的是键。
示例:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
for key in student:
print(key)
输出结果:
name
age
city
也可以使用 keys():
for key in student.keys():
print(key)
这两种效果类似。
教学时可以这样讲:
for key in 字典,默认拿到的是键。
二十三、遍历字典的值
使用 values() 可以遍历所有值。
示例:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
for value in student.values():
print(value)
输出结果:
小明
18
北京
注意:
values() 只能拿到值,拿不到对应的键。
二十四、遍历字典的键值对 items()
使用 items() 可以同时遍历键和值。
示例:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
for key, value in student.items():
print(key, "=", value)
输出结果:
name = 小明
age = 18
city = 北京
这是字典遍历中最常用的方式之一。
可以这样理解:
items() 每次取出一组键值对。
key 接收键。
value 接收值。
二十五、keys()、values()、items() 的区别
keys() 获取所有键
values() 获取所有值
items() 获取所有键值对
示例:
student = {
"name": "小明",
"age": 18
}
print(student.keys())
print(student.values())
print(student.items())
输出结果类似:
dict_keys(['name', 'age'])
dict_values(['小明', 18])
dict_items([('name', '小明'), ('age', 18)])
如果想转换成列表:
keys = list(student.keys())
values = list(student.values())
items = list(student.items())
初学阶段重点掌握:
for key, value in student.items():
print(key, value)
二十六、字典是可变对象
字典是可变对象,可以添加、修改和删除内容。
示例:
student = {"name": "小明"}
student["age"] = 18
student["name"] = "小红"
print(student)
输出结果:
{'name': '小红', 'age': 18}
这和字符串不同。
字符串不能直接修改某个字符。
字典可以直接修改某个键对应的值。
二十七、字典复制
字典复制也容易出错。
先看一个例子:
a = {"name": "小明"}
b = a
b["age"] = 18
print(a)
print(b)
输出结果:
{'name': '小明', 'age': 18}
{'name': '小明', 'age': 18}
原因:
b = a 不是复制一个新字典。
它只是让 b 和 a 指向同一个字典。
如果想复制一个新字典,可以使用 copy():
a = {"name": "小明"}
b = a.copy()
b["age"] = 18
print(a)
print(b)
输出结果:
{'name': '小明'}
{'name': '小明', 'age': 18}
注意:
copy() 是浅拷贝。
如果字典里面还有列表或字典,情况会更复杂。
初学阶段先记住:
b = a 不是复制新字典。
b = a.copy() 才是复制一个普通的新字典。
二十八、嵌套字典
字典的值也可以是另一个字典。
这叫嵌套字典。
示例:
students = {
"1001": {
"name": "小明",
"age": 18
},
"1002": {
"name": "小红",
"age": 17
}
}
可以把它理解成:
外层字典:学号 -> 学生信息
内层字典:姓名、年龄等具体信息
获取小明的姓名:
print(students["1001"]["name"])
输出结果:
小明
修改小红年龄:
students["1002"]["age"] = 18
添加一个学生:
students["1003"] = {
"name": "小刚",
"age": 19
}
嵌套字典适合保存结构化数据。
例如:
多个学生的信息
多个商品的信息
多个用户的信息
二十九、遍历嵌套字典
示例:
students = {
"1001": {"name": "小明", "age": 18},
"1002": {"name": "小红", "age": 17},
"1003": {"name": "小刚", "age": 19}
}
for student_id, info in students.items():
print("学号:", student_id)
print("姓名:", info["name"])
print("年龄:", info["age"])
输出结果:
学号: 1001
姓名: 小明
年龄: 18
学号: 1002
姓名: 小红
年龄: 17
学号: 1003
姓名: 小刚
年龄: 19
解释:
student_id 接收外层字典的键。
info 接收外层字典的值,也就是内层字典。
info["name"] 获取内层字典中的姓名。
三十、列表中放字典
实际开发中,也经常用列表保存多个字典。
示例:
students = [
{"name": "小明", "age": 18, "score": 90},
{"name": "小红", "age": 17, "score": 95},
{"name": "小刚", "age": 19, "score": 85}
]
这种结构可以理解为:
列表保存多个学生。
每个学生用一个字典表示。
遍历:
for student in students:
print(student["name"], student["score"])
输出结果:
小明 90
小红 95
小刚 85
按成绩排序:
students.sort(key=lambda student: student["score"], reverse=True)
print(students)
这种结构非常常见,适合作为课堂综合案例。
三十一、字典推导式
字典推导式可以用简洁方式生成字典。
普通写法:
squares = {}
for i in range(1, 6):
squares[i] = i * i
print(squares)
输出结果:
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
字典推导式写法:
squares = {i: i * i for i in range(1, 6)}
print(squares)
输出结果一样:
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
筛选字典:
scores = {
"小明": 90,
"小红": 55,
"小刚": 80
}
passed = {name: score for name, score in scores.items() if score >= 60}
print(passed)
输出结果:
{'小明': 90, '小刚': 80}
教学建议:
初学阶段先掌握普通 for 循环写法,再学习字典推导式。
三十二、fromkeys() 创建字典
fromkeys() 可以用一组键创建字典,并给它们设置相同的默认值。
示例:
keys = ["name", "age", "city"]
student = dict.fromkeys(keys, None)
print(student)
输出结果:
{'name': None, 'age': None, 'city': None}
如果不指定默认值,默认就是 None。
student = dict.fromkeys(keys)
注意:
fromkeys() 初学阶段了解即可。
三十三、字典合并
1. 使用 update()
a = {"name": "小明"}
b = {"age": 18}
a.update(b)
print(a)
输出结果:
{'name': '小明', 'age': 18}
注意:
update() 会修改原字典 a。
2. 使用 | 合并
Python 3.9 之后,字典可以使用 | 合并。
a = {"name": "小明"}
b = {"age": 18}
c = a | b
print(c)
输出结果:
{'name': '小明', 'age': 18}
如果有相同的键,右边的值会覆盖左边。
a = {"name": "小明", "age": 18}
b = {"age": 20}
c = a | b
print(c)
输出结果:
{'name': '小明', 'age': 20}
教学提醒:
如果学生使用的 Python 版本低于 3.9,就不能使用 | 合并字典。
三十四、字典和列表的区别
列表和字典都可以保存多个数据,但使用方式不同。
列表 list:
通过位置索引访问数据。
适合保存一组有顺序的数据。
字典 dict:
通过键访问数据。
适合保存有明确名称的数据。
列表示例:
student = ["小明", 18, "北京"]
print(student[0])
问题:
student[0] 是姓名,但只看代码不够直观。
字典示例:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
print(student["name"])
优点:
student["name"] 一看就知道是在取姓名。
教学时可以这样讲:
列表适合按顺序放数据。
字典适合按名称管理数据。
三十五、常见注意事项
1. 字典使用大括号 {}
正确写法:
student = {"name": "小明", "age": 18}
不要和列表的方括号混淆:
students = ["小明", "小红"]
2. 键和值之间使用冒号
错误写法:
student = {"name" = "小明"}
正确写法:
student = {"name": "小明"}
3. 多个键值对之间使用逗号
错误写法:
student = {
"name": "小明"
"age": 18
}
正确写法:
student = {
"name": "小明",
"age": 18
}
4. 访问不存在的键会报 KeyError
student = {"name": "小明"}
print(student["age"])
会报错。
更安全:
print(student.get("age", "未知"))
5. get() 不会修改字典
student = {"name": "小明"}
age = student.get("age", 18)
print(student)
输出:
{'name': '小明'}
解释:
get("age", 18) 只是取值时给默认值。
它不会自动把 "age": 18 添加到字典中。
如果想不存在时添加键,可以使用:
student.setdefault("age", 18)
6. in 判断的是键,不是值
student = {"name": "小明"}
print("name" in student)
print("小明" in student)
输出:
True
False
7. 键不能重复
student = {
"name": "小明",
"name": "小红"
}
最终只会保留后面的值。
8. 键不要使用可变类型
错误写法:
data = {
["name"]: "小明"
}
列表不能作为键。
9. b = a 不是复制新字典
a = {"name": "小明"}
b = a
b["age"] = 18
print(a)
输出:
{'name': '小明', 'age': 18}
如果想复制:
b = a.copy()
10. 遍历时不要随意修改字典大小
不推荐:
scores = {"小明": 90, "小红": 55, "小刚": 80}
for name, score in scores.items():
if score < 60:
del scores[name]
这样可能会报错。
更推荐:
scores = {"小明": 90, "小红": 55, "小刚": 80}
passed = {}
for name, score in scores.items():
if score >= 60:
passed[name] = score
print(passed)
或者:
passed = {name: score for name, score in scores.items() if score >= 60}
三十六、课堂示例
示例 1:保存一个学生信息
student = {
"name": "小明",
"age": 18,
"score": 95
}
print(student["name"])
print(student["age"])
print(student["score"])
讲解重点:
字典通过键获取值。
student["name"] 表示获取姓名。
示例 2:安全获取城市信息
student = {
"name": "小明",
"age": 18
}
city = student.get("city", "未知城市")
print(city)
讲解重点:
get() 可以避免键不存在时报错。
示例 3:添加和修改学生信息
student = {
"name": "小明",
"age": 18
}
student["city"] = "北京"
student["age"] = 19
print(student)
讲解重点:
键不存在就是添加。
键已存在就是修改。
示例 4:删除学生信息
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
age = student.pop("age")
print("删除的年龄是:", age)
print(student)
讲解重点:
pop() 根据键删除,并返回被删除的值。
示例 5:遍历学生信息
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
for key, value in student.items():
print(key, ":", value)
讲解重点:
items() 可以同时拿到键和值。
示例 6:统计字符出现次数
text = "banana"
count = {}
for ch in text:
count[ch] = count.get(ch, 0) + 1
print(count)
输出结果:
{'b': 1, 'a': 3, 'n': 2}
讲解重点:
get(ch, 0) 表示如果 ch 不存在,就先当作 0。
然后加 1。
这是 get() 的经典用法。
示例 7:保存多个学生信息
students = [
{"name": "小明", "score": 90},
{"name": "小红", "score": 95},
{"name": "小刚", "score": 85}
]
for student in students:
print(student["name"], student["score"])
讲解重点:
列表中可以保存多个字典。
每个字典表示一个学生。
示例 8:按成绩筛选学生
students = [
{"name": "小明", "score": 90},
{"name": "小红", "score": 55},
{"name": "小刚", "score": 85}
]
passed_students = []
for student in students:
if student["score"] >= 60:
passed_students.append(student)
print(passed_students)
讲解重点:
字典可以表示单个对象。
列表可以保存多个对象。
三十七、课堂练习
练习 1:创建学生字典
要求:创建一个字典,保存姓名、年龄、城市。
参考代码:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
print(student)
练习 2:获取字典中的值
要求:输出学生的姓名和年龄。
参考代码:
student = {
"name": "小明",
"age": 18
}
print(student["name"])
print(student["age"])
练习 3:使用 get() 获取值
要求:使用 get() 获取城市,如果没有城市就输出“未知”。
参考代码:
student = {
"name": "小明",
"age": 18
}
city = student.get("city", "未知")
print(city)
练习 4:添加键值对
要求:给学生字典添加成绩。
参考代码:
student = {
"name": "小明",
"age": 18
}
student["score"] = 95
print(student)
练习 5:修改键对应的值
要求:把年龄从 18 修改为 19。
参考代码:
student = {
"name": "小明",
"age": 18
}
student["age"] = 19
print(student)
练习 6:删除一个键值对
要求:删除学生字典中的城市。
参考代码:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
student.pop("city")
print(student)
练习 7:遍历字典
要求:遍历输出学生字典中的所有键和值。
参考代码:
student = {
"name": "小明",
"age": 18,
"city": "北京"
}
for key, value in student.items():
print(key, value)
练习 8:统计单词出现次数
要求:统计列表中每个单词出现的次数。
参考代码:
words = ["apple", "banana", "apple", "orange", "banana", "apple"]
count = {}
for word in words:
count[word] = count.get(word, 0) + 1
print(count)
练习 9:保存多个商品信息
要求:用列表和字典保存多个商品名称和价格。
参考代码:
products = [
{"name": "苹果", "price": 5},
{"name": "香蕉", "price": 3},
{"name": "橙子", "price": 4}
]
for product in products:
print(product["name"], product["price"])
练习 10:筛选高分学生
要求:筛选成绩大于等于 90 的学生。
参考代码:
students = [
{"name": "小明", "score": 90},
{"name": "小红", "score": 85},
{"name": "小刚", "score": 95}
]
good_students = []
for student in students:
if student["score"] >= 90:
good_students.append(student)
print(good_students)
三十八、教学建议
讲解字典时,可以按照下面顺序:
1. 先用通讯录或学生信息引出键值对
2. 讲字典的创建
3. 讲键和值的概念
4. 讲通过键获取值
5. 讲 get(),重点强调安全获取
6. 讲添加和修改
7. 讲删除
8. 讲 keys、values、items 遍历
9. 讲嵌套字典和列表中放字典
10. 最后通过统计字符次数、学生信息管理等例子练习
可以用下面的问题引导学生:
如果要保存一个学生的姓名、年龄、成绩,用列表清楚还是字典清楚?
字典为什么叫键值对?
student["age"] 和 student.get("age") 有什么区别?
for key in student 遍历出来的是键还是值?
如果字典中没有某个键,怎样避免程序报错?
教学重点建议放在:
键值对
通过键获取值
get()
添加和修改
删除
items() 遍历
字典和列表的区别
嵌套结构
字典推导式、setdefault、fromkeys、字典合并可以作为拓展内容。
三十九、总结
字典是 Python 中用来保存键值对的数据结构。
可以这样记:
字典:用 {} 表示
键:用来查找数据
值:真正保存的数据
键值对:键和值组成的一项数据
常用操作:
student = {"name": "小明", "age": 18}
print(student["name"])
print(student.get("city", "未知"))
student["score"] = 95
student["age"] = 19
student.pop("score")
for key, value in student.items():
print(key, value)
常用方法:
get() 安全获取值
keys() 获取所有键
values() 获取所有值
items() 获取所有键值对
update() 批量添加或修改
pop() 删除指定键并返回值
clear() 清空字典
copy() 复制字典
最重要的注意事项:
1. 字典中的数据是键值对
2. 键不能重复
3. 键通常使用字符串
4. 通过 字典[键] 获取值,键不存在会报错
5. get() 获取不存在的键不会报错
6. in 判断的是键,不是值
7. 键不存在时赋值是添加,键存在时赋值是修改
8. 遍历键值对常用 items()
9. b = a 不是复制新字典
10. 遍历时不要随意修改字典大小
一句话总结:
字典让我们可以用“名字”管理数据,比单纯靠位置索引更清楚,非常适合保存对象信息和统计结果。