自学Python第11天:字典------我终于能让程序像查字典一样找东西了
新手向 | 2026-07-03
前面学过的列表和元组,都是按顺序存数据的。想找到某个数据,得知道它的位置(下标)。
但有些场景不适合用列表。比如我想存一个班级学生的成绩,用列表的话是这样:
python
students = ["张三", "李四", "王五"]
scores = [85, 92, 78]
想查张三的成绩,得先找到张三所在列表里的位置,再去成绩列表里找同一个位置的数据,非常麻烦。
今天就来学字典------一种用"名字"来找"值"的数据容器,就像查字典一样方便。
一、字典是什么
想象一下你手机上的通讯录。你不会说"第3个人是谁",而是直接说"张三的电话是多少"。通讯录就是通过"联系人姓名"找到"电话号码"的。
字典就是程序里的通讯录------它用"键"(Key)来查找对应的"值"(Value)。
在Python里,字典用花括号{}表示,每一对数据由"键"和"值"组成,用冒号:连接,多对数据用逗号隔开:
python
# 键 值 键 值 键 值
student = {"name": "张三", "age": 18, "city": "北京"}
键是查找的依据,值是要找的数据。
键必须是不可变类型------比如字符串、数字、元组。列表是可变类型,不能作为字典的键(这个坑我们后面会专门讲)。
二、根据键获取值
想拿到字典里的某个值,用字典名键:
python
student = {"name": "张三", "age": 18, "city": "北京"}
print(student["name"]) # 张三
print(student["age"]) # 18
三、一个我踩过的坑:KeyError
如果访问一个不存在的键,Python会报错:
python
student = {"name": "张三", "age": 18}
print(student["city"])
运行后报错:
text
KeyError: 'city'
因为字典里没有city这个键,所以找不到。每次访问字典之前,最好确认你用的键是存在的。
四、字典的常用操作
1.新增或修改
直接给一个键赋值,如果键不存在,就新增;如果键已存在,就覆盖:
python
student = {"name": "张三", "age": 18}
# 新增一个键值对
student["city"] = "北京"
print(student) # {'name': '张三', 'age': 18, 'city': '北京'}
# 修改已有的键的值
student["age"] = 19
print(student) # {'name': '张三', 'age': 19, 'city': '北京'}
2.删除:pop()
删除指定的键值对:
python
student = {"name": "张三", "age": 18, "city": "北京"}
student.pop("city")
print(student) # {'name': '张三', 'age': 18}
3.安全取值:get()
用get()方法可以在键不存在时返回一个默认值,而不是报错:
python
student = {"name": "张三", "age": 18}
print(student.get("city")) # None
print(student.get("city", "未知")) # 未知
4.查看所有键、所有值、所有键值对
python
student = {"name": "张三", "age": 18, "city": "北京"}
print(student.keys()) # dict_keys(['name', 'age', 'city'])
print(student.values()) # dict_values(['张三', 18, '北京'])
print(student.items()) # dict_items([('name', '张三'), ('age', 18), ('city', '北京')])
keys()、values()、items() 返回的是视图对象,可以直接用于循环遍历,但不能像列表那样直接按下标访问。如果需要下标访问,可以用 list() 转换后使用,但实际场景中通常直接遍历就够了。
五、遍历字典
1.遍历所有键值对(最常用)
python
student = {"name": "张三", "age": 18, "city": "北京"}
for key, value in student.items():
print(f"{key}: {value}")
运行结果:
text
name: 张三
age: 18
city: 北京
2.只遍历键
python
for key in student.keys():
print(key)
3.只遍历值
python
for value in student.values():
print(value)
六、一个我踩过的坑:列表不能作为字典的键
前面提到过,字典的键必须是不可变类型。列表是可变的,所以不能当键:
python
# 错误示范
d = {["a", "b"]: "这是列表当键"} # 报错!
运行后会报 TypeError: unhashable type: 'list'。因为列表的内容可以随时增删改,Python无法保证它稳定可用。
但元组可以作为键,因为元组是不可变的:
python
d = {("a", "b"): "这是元组当键"}
print(d[("a", "b")]) # 这是元组当键
七、列表VS字典
| 场景 | 推荐用 | 原因 |
|---|---|---|
| 按编号/顺序存取数据 | 列表 | 按位置查找,速度快 |
| 按名字/ID查找数据 | 字典 | 键值对应,查找方便 |
| 数据是一组固定字段 | 字典 | 每个字段有名字,代码可读性高 |
| 数据需要频繁增删改 | 列表或字典都可以 | 两者都支持,看需求 |
八、综合示例:学生成绩管理系统
把今天学的东西串起来:
python
# 用字典存储学生信息
students = {}
while True:
print("\n--- 学生成绩管理系统 ---")
print("1. 添加学生")
print("2. 查看所有学生")
print("3. 查询学生成绩")
print("4. 删除学生")
print("5. 退出")
choice = input("请选择:")
if choice == "1":
name = input("请输入姓名:")
score = input("请输入成绩:")
students[name] = score
print("添加成功!")
elif choice == "2":
if len(students) == 0:
print("暂无学生数据")
else:
for name, score in students.items():
print(f"{name}:{score}分")
elif choice == "3":
name = input("请输入要查询的姓名:")
score = students.get(name)
if score is None:
print("未找到该学生")
else:
print(f"{name}的成绩是:{score}分")
elif choice == "4":
name = input("请输入要删除的姓名:")
if name in students:
students.pop(name)
print("删除成功!")
else:
print("未找到该学生")
elif choice == "5":
print("再见!")
break
else:
print("无效选择,请重新输入")
这段代码包含了今天学的:
·字典的定义(students = {})
·新增/修改(studentsname = score)
·查询(students.get(name))
·删除(students.pop(name))
·遍历(for name, score in students.items())
小结
今天学的东西,整理成一张速查表:
| 知识点 | 说明 | 示例 |
|---|---|---|
| 定义字典 | 用 {} 包裹键值对 | d = |
| 取值 | 通过键获取值 | d"name" |
| 新增/修改 | 键不存在则新增,存在则覆盖 | d"age" = 18 |
| get() | 安全取值 | d.get("city", "未知") |
| pop() | 删除键值对 | d.pop("city") |
| keys() | 获取所有键 | d.keys() |
| values() | 获取所有值 | d.values() |
| items() | 获取所有键值对 | d.items() |
| 遍历 | 循环取出键值对 | for k, v in d.items(): |
| 键的要求 | 必须是不可变类型 | 字符串、数字、元组 |
什么时候用字典?
·需要根据某个"名字"查找对应的"值"
·存储一条记录的多个字段(如用户信息、商品信息)
·需要快速查找,不关心顺序
下一篇我打算学集合。
如果你也在学Python,欢迎在评论区告诉我你今天学到了什么,或者遇到了什么报错,一起交流!
相关文章:
- 自学Python第1天:从下载PyCharm和安装环境开始
- 自学Python第2天:敲下第一行print("Hello World"),我遇到了3个问题
- 自学Python第3天:数据类型、转换、运算符------我终于搞懂了为什么"1"和1不一样
- 自学Python第4天:字符串的三种定义方式、拼接、格式化
- 自学Python第5天:数据输入(input语句)、布尔类型、比较运算符和逻辑运算符
- 自学Python第6天:if判断、if-else、if-elif-else和嵌套判断
- 自学Python第7天:for循环和while循环------我终于让程序能重复做一件事了
- 自学Python第8天:函数------我终于能把重复的代码"打包"起来了
- 自学Python第9天:列表------我终于能把一堆东西放在一起了
- 自学Python第10天:元组和切片------我终于搞懂了什么是"不可变的列表"