Python:第7天:字典 —— 通过“名字”查找数据
🎯 今日目标
-
理解字典的概念(键值对)
-
学会创建字典和访问值
-
掌握字典的增删改操作
-
学会遍历字典(键、值、键值对)
-
掌握常用字典方法:
get(),keys(),values(),items(),pop() -
理解字典和列表的适用场景
📖 一、字典(Dictionary)是什么?
字典是一个无序的、可变的容器,以键值对(Key-Value Pair)的形式存储数据。
生活中的类比:
-
电话簿:通过“人名”(键)查到“电话号码”(值)
-
词典:通过“单词”(键)查到“释义”(值)
-
学生花名册:通过“学号”(键)查到“姓名”(值)
1.1 创建字典
用花括号 {} 包裹,键和值用冒号 : 分隔,键值对之间用逗号分隔。
python
# 空字典
empty_dict = {}
# 存储学生成绩
scores = {"张三": 85, "李四": 92, "王五": 78}
print(scores)
# 存储个人信息
person = {
"name": "小明",
"age": 18,
"city": "北京"
}
print(person)
运行结果:
text
{'张三': 85, '李四': 92, '王五': 78}
{'name': '小明', 'age': 18, 'city': '北京'}
1.2 字典的键有什么要求?
-
键必须是不可变类型(字符串、数字、元组),通常是字符串
-
键必须是唯一的(重复键会覆盖前一个值)
-
值可以是任意类型(数字、字符串、列表、甚至另一个字典)
python
# 正确:键是字符串或数字
d1 = {"name": "张三", "age": 20}
d2 = {1: "one", 2: "two"}
# 错误:键是列表(列表是可变的,不能作为键)
# d3 = {[1,2]: "value"} # 报错 TypeError
# 值可以是任何类型
d4 = {
"name": "李华",
"scores": [85, 92, 78], # 值是一个列表
"address": {"city": "上海", "district": "浦东"} # 值是一个字典(嵌套)
}
🔍 二、访问字典中的值
2.1 通过键访问(方括号语法)
python
scores = {"张三": 85, "李四": 92, "王五": 78}
print(scores["张三"]) # 85
print(scores["李四"]) # 92
2.2 用 get() 方法访问(更安全)
如果键不存在,方括号语法会报错,而 get() 会返回 None(或你指定的默认值)。
python
scores = {"张三": 85, "李四": 92, "王五": 78}
# 键存在
print(scores.get("张三")) # 85
# 键不存在,返回 None
print(scores.get("赵六")) # None
# 键不存在,返回自定义默认值
print(scores.get("赵六", "查无此人")) # 查无此人
python
# 方括号方式访问不存在的键 → 报错
scores = {"张三": 85, "李四": 92}
print(scores["王五"])
报错:
text
KeyError: '王五'
💡 建议:如果不确定键是否存在,优先使用
get()方法。
✏️ 三、修改和添加键值对
3.1 添加或修改(通过赋值)
python
scores = {"张三": 85, "李四": 92}
# 修改已有键的值
scores["张三"] = 90
print(scores) # {'张三': 90, '李四': 92}
# 添加新键值对(键不存在时)
scores["王五"] = 78
print(scores) # {'张三': 90, '李四': 92, '王五': 78}
💡 同一个赋值语句有两种效果:键存在就修改,键不存在就添加。非常灵活。
3.2 使用 update() 合并另一个字典
python
scores = {"张三": 85, "李四": 92}
new_scores = {"李四": 95, "王五": 78} # 李四的值会覆盖,王五会新增
scores.update(new_scores)
print(scores) # {'张三': 85, '李四': 95, '王五': 78}
❌ 四、删除键值对
4.1 pop(键):删除并返回对应的值
python
scores = {"张三": 85, "李四": 92, "王五": 78}
removed = scores.pop("李四")
print(removed) # 92
print(scores) # {'张三': 85, '王五': 78}
如果键不存在,pop() 会报错。可以设置默认值来避免:
python
scores = {"张三": 85, "李四": 92}
removed = scores.pop("赵六", "不存在")
print(removed) # 不存在
4.2 del:删除键值对(不返回值)
python
scores = {"张三": 85, "李四": 92, "王五": 78}
del scores["李四"]
print(scores) # {'张三': 85, '王五': 78}
4.3 clear():清空所有键值对
python
scores = {"张三": 85, "李四": 92}
scores.clear()
print(scores) # {}
🔄 五、遍历字典
5.1 遍历所有的键(keys())
python
scores = {"张三": 85, "李四": 92, "王五": 78}
for name in scores.keys():
print(name)
运行结果:
text
张三 李四 王五
💡
scores.keys()可以省略,直接for name in scores:效果相同。
5.2 遍历所有的值(values())
python
scores = {"张三": 85, "李四": 92, "王五": 78}
for score in scores.values():
print(score)
运行结果:
text
85 92 78
5.3 同时遍历键和值(items())
这是最常用的遍历方式!
python
scores = {"张三": 85, "李四": 92, "王五": 78}
for name, score in scores.items():
print(f"{name} 的成绩是 {score} 分")
运行结果:
text
张三 的成绩是 85 分 李四 的成绩是 92 分 王五 的成绩是 78 分
💡
items()返回的是键值对元组,用两个变量可以分别接收键和值。
🔍 六、检查键是否存在
6.1 使用 in 运算符
python
scores = {"张三": 85, "李四": 92, "王五": 78}
print("张三" in scores) # True
print("赵六" in scores) # False
if "张三" in scores:
print(f"张三的成绩是 {scores['张三']}")
6.2 检查值是否存在(用 in + values())
python
scores = {"张三": 85, "李四": 92, "王五": 78}
print(85 in scores.values()) # True
print(100 in scores.values()) # False
📏 七、字典的长度
python
scores = {"张三": 85, "李四": 92, "王五": 78}
print(len(scores)) # 3
🆚 八、列表 vs 字典:什么时候用哪个?
| 特点 | 列表(List) | 字典(Dict) |
|---|---|---|
| 查找方式 | 通过索引(数字) | 通过键(通常是字符串) |
| 有序性 | 有序(有明确的顺序) | Python 3.7+ 保持插入顺序,但一般不依赖顺序 |
| 适用场景 | 需要按顺序存储的一组数据,如排行榜、待办列表 | 需要通过名称/ID快速查找对应信息,如用户信息、配置项 |
实际选择建议:
-
需要按顺序操作或通过位置访问 → 列表
-
需要通过名称快速查找对应的值 → 字典
🧪 九、综合示例:学生成绩管理(字典版)
python
# 第7天综合练习:用字典管理学生成绩
students = {
"张三": {"语文": 85, "数学": 92, "英语": 78},
"李四": {"语文": 76, "数学": 88, "英语": 90},
"王五": {"语文": 92, "数学": 79, "英语": 85}
}
print("=" * 40)
print(" 学生成绩管理系统")
print("=" * 40)
# 1. 显示所有学生成绩
for name, scores in students.items():
print(f"\n{name}的成绩:")
total = 0
for subject, score in scores.items():
print(f" {subject}: {score}分")
total += score
average = total / len(scores)
print(f" 平均分: {average:.1f}")
# 2. 计算各科平均分
print("\n" + "=" * 40)
print(" 各科平均分")
print("=" * 40)
# 初始化各科总分
subject_totals = {"语文": 0, "数学": 0, "英语": 0}
count = len(students)
for scores in students.values():
for subject, score in scores.items():
subject_totals[subject] += score
for subject, total in subject_totals.items():
print(f"{subject}平均分: {total / count:.1f}")
# 3. 查找学生
search_name = input("\n请输入要查询的学生姓名: ")
if search_name in students:
scores = students[search_name]
print(f"{search_name}的成绩:")
for subject, score in scores.items():
print(f" {subject}: {score}分")
else:
print(f"未找到学生: {search_name}")
运行示例:
text
========================================
学生成绩管理系统
========================================
张三的成绩:
语文: 85分
数学: 92分
英语: 78分
平均分: 85.0
李四的成绩:
语文: 76分
数学: 88分
英语: 90分
平均分: 84.7
王五的成绩:
语文: 92分
数学: 79分
英语: 85分
平均分: 85.3
========================================
各科平均分
========================================
语文平均分: 84.3
数学平均分: 86.3
英语平均分: 84.3
请输入要查询的学生姓名: 李四
李四的成绩:
语文: 76分
数学: 88分
英语: 90分
🐛 十、新手常见错误及解决
| 错误现象 | 错误代码示例 | 解决方法 |
|---|---|---|
KeyError(键不存在) | scores["赵六"] | 用 get() 代替,或用 in 先检查 |
| 把列表当作键 | {[1,2]: "value"} | 改用元组或字符串作为键 |
| 遍历时修改字典 | for k in d:d[k] = 新值 可能导致RuntimeError | 先复制一份:for k in list(d.keys()) |
| 忘记键是字符串,漏写引号 | {name: "张三"}(name 被当作变量) | 键如果是字符串要用引号:{"name": "张三"} |
用 d[0] 访问字典的第一个元素 | 字典无序,没有“第一个”的概念 | 用 list(d.keys())[0] 或 next(iter(d)) |
错误演示:键不存在导致 KeyError
python
scores = {"张三": 85, "李四": 92}
print(scores["王五"])
报错:
text
KeyError: '王五'
修正:
python
scores = {"张三": 85, "李四": 92}
print(scores.get("王五", "查无此人")) # 查无此人
🎯 今日总结
今天你学会了:
-
字典的概念和创建方法
-
通过键访问值(方括号和
get()) -
添加和修改键值对(赋值和
update()) -
删除键值对(
pop(),del,clear()) -
遍历字典(
keys(),values(),items()) -
检查键是否存在(
in) -
字典和列表的适用场景对比
更多推荐



所有评论(0)