1. 什么是字典
字典(dict)是 Python 中最常用的内置数据类型之一,用来存储**键值对(key-value)**数据。
它的特点:
- 用大括号
{}表示,元素形式为key: value - 键(key)必须是不可变类型,如字符串、数字、元组
- 键在同一个字典中唯一,重复赋值会覆盖旧值
- Python 3.7+ 中字典保持插入顺序
- 查找、插入、删除的平均时间复杂度都是 O(1)
一句话理解:字典就像一本真正的字典,通过「词条(key)」快速查到「解释(value)」。
python
# 一个最简单的字典
student = {
"name": "小明",
"age": 18,
"score": 92.5
}
print(student)
print(type(student))
输出:
text
{'name': '小明', 'age': 18, 'score': 92.5}
<class 'dict'>
2. 字典的创建方式
创建字典有多种写法,菜鸟阶段掌握前三种即可。
python
# 方式一:字面量
d1 = {"a": 1, "b": 2}
# 方式二:dict() 构造函数 + 关键字参数
d2 = dict(name="小明", age=18)
# 方式三:由可迭代的键值对序列创建
d3 = dict([("a", 1), ("b", 2)])
# 方式四:zip 打包两个列表
keys = ["name", "age"]
values = ["小明", 18]
d4 = dict(zip(keys, values))
# 方式五:字典推导式
d5 = {x: x * x for x in range(1, 5)}
# 空字典
empty = {}
empty2 = dict()
print(d1, d2, d3, d4, d5, empty, empty2, sep="\n")
输出:
text
{'a': 1, 'b': 2}
{'name': '小明', 'age': 18}
{'a': 1, 'b': 2}
{'name': '小明', 'age': 18}
{1: 1, 2: 4, 3: 9, 4: 16}
{}
{}
3. 字典的 CRUD 操作
CRUD 分别指 Create(增)、Read(查)、Update(改)、Delete(删)。下面用一个「学生信息管理」的小案例贯穿讲解。
3.1 Create:新增键值对
直接通过 字典[新键] = 值 即可新增;也可以用 setdefault(),键不存在时才写入。
python
student = {"name": "小明", "age": 18}
# 直接赋值新增
student["score"] = 92.5
student["city"] = "杭州"
print(student)
# setdefault:键不存在才新增,已存在则返回原值
student.setdefault("gender", "男")
student.setdefault("age", 20) # age 已存在,不会被覆盖
print(student)
输出:
text
{'name': '小明', 'age': 18, 'score': 92.5, 'city': '杭州'}
{'name': '小明', 'age': 18, 'score': 92.5, 'city': '杭州', 'gender': '男'}
3.2 Read:查询键值对
查询是最常用的操作,注意「键不存在」时的两种处理方式。
python
student = {"name": "小明", "age": 18, "score": 92.5}
# 方式一:[] 取值,键不存在会抛 KeyError
print(student["name"])
# 方式二:get() 取值,键不存在返回 None 或指定默认值(推荐)
print(student.get("age"))
print(student.get("city")) # None
print(student.get("city", "未知")) # 未知
# 判断键是否存在
print("score" in student) # True
print("city" in student) # False
# 遍历字典
for key in student:
print(key, "=", student[key])
for key, value in student.items():
print(f"{key}: {value}")
输出:
text
小明
18
None
未知
True
False
name = 小明
age = 18
score = 92.5
name: 小明
age: 18
score: 92.5
3.3 Update:修改键值对
键已存在时直接赋值就是修改;批量修改可用 update()。
python
student = {"name": "小明", "age": 18, "score": 92.5}
# 单个修改
student["age"] = 19
print(student)
# 批量修改 / 合并另一个字典
student.update({"score": 95, "city": "杭州"})
print(student)
输出:
text
{'name': '小明', 'age': 19, 'score': 92.5}
{'name': '小明', 'age': 19, 'score': 95, 'city': '杭州'}
3.4 Delete:删除键值对
删除有四种常用方式,区别在于「键不存在时」的表现。
python
student = {"name": "小明", "age": 18, "score": 92.5, "city": "杭州"}
# 方式一:del,键不存在会抛 KeyError
del student["city"]
print(student)
# 方式二:pop(),删除并返回该值,可给默认值避免报错
score = student.pop("score")
print("删除的分数:", score)
print(student)
# 方式三:popitem(),删除并返回最后一个键值对(Python 3.7+)
item = student.popitem()
print("删除的键值对:", item)
print(student)
# 方式四:clear(),清空整个字典
student.clear()
print(student)
输出:
text
{'name': '小明', 'age': 18, 'score': 92.5}
删除的分数: 92.5
{'name': '小明', 'age': 18}
删除的键值对: ('age', 18)
{'name': '小明'}
{}
4. 完整实战案例:学生信息管理
把上面的 CRUD 组合起来,写一个可以循环操作的小程序。
python
def main():
students = {} # key: 学号, value: 学生信息字典
while True:
print("\n===== 学生信息管理 =====")
print("1. 新增学生")
print("2. 查询学生")
print("3. 修改学生")
print("4. 删除学生")
print("5. 查看全部")
print("0. 退出")
choice = input("请选择操作:").strip()
if choice == "1":
sid = input("学号:").strip()
if sid in students:
print("该学号已存在!")
continue
name = input("姓名:").strip()
age = int(input("年龄:").strip())
students[sid] = {"name": name, "age": age}
print("新增成功")
elif choice == "2":
sid = input("学号:").strip()
info = students.get(sid)
if info:
print(f"学号 {sid}:姓名 {info['name']},年龄 {info['age']}")
else:
print("未找到该学生")
elif choice == "3":
sid = input("学号:").strip()
if sid not in students:
print("未找到该学生")
continue
name = input("新姓名(回车跳过):").strip()
age = input("新年龄(回车跳过):").strip()
if name:
students[sid]["name"] = name
if age:
students[sid]["age"] = int(age)
print("修改成功")
elif choice == "4":
sid = input("学号:").strip()
removed = students.pop(sid, None)
print("删除成功" if removed else "未找到该学生")
elif choice == "5":
if not students:
print("暂无数据")
for sid, info in students.items():
print(f"{sid} -> {info}")
elif choice == "0":
print("再见!")
break
else:
print("无效选项,请重新输入")
if __name__ == "__main__":
main()
运行效果示例:
text
===== 学生信息管理 =====
1. 新增学生
2. 查询学生
3. 修改学生
4. 删除学生
5. 查看全部
0. 退出
请选择操作:1
学号:1001
姓名:小明
年龄:18
新增成功
5. 常用方法速查表
| 方法 | 作用 | 键不存在时 |
|---|---|---|
d[key] |
取值 | 抛 KeyError |
d.get(key, default) |
取值 | 返回 default |
d[key] = value |
新增或修改 | 新增 |
d.setdefault(key, default) |
键不存在时写入 | 写入并返回 default |
d.update(other) |
批量更新 | 新增缺失键 |
del d[key] |
删除 | 抛 KeyError |
d.pop(key, default) |
删除并返回值 | 返回 default |
d.popitem() |
删除最后一个键值对 | 空字典抛 KeyError |
d.clear() |
清空 | --- |
d.keys() / d.values() / d.items() |
获取键 / 值 / 键值对视图 | --- |
6. 新手常见坑
- 用
[]取不存在的键 :会直接报KeyError,查询时优先用get()。 - 把列表当键 :
{[1, 2]: "x"}会报TypeError,因为列表不可哈希;需要时改用元组。 - 遍历时修改字典 :
for k in d: del d[k]会报RuntimeError,应先复制一份for k in list(d):。 - 误以为
keys()返回列表 :它返回的是视图对象,需要列表时用list(d.keys())。 update()会覆盖同名键:合并字典时注意键冲突。
7. 小结
- 字典用
{}存储键值对,键唯一且必须可哈希。 - CRUD 四件套:
d[k] = v增改、d.get(k)查、d.update()批量改、del/pop()删。 - 查询优先用
get(),删除优先用pop(key, default),能有效避免异常。 - 掌握字典后,可以继续学习
defaultdict、Counter等collections模块中的高级字典类型。