本章摘要
- 核心目标:掌握字典的创建、增删改查、遍历与嵌套,能用键值对组织结构化数据
- 核心知识点:字典创建、通过键访问值、增/删/改、
keys()/values()/items()遍历、嵌套字典、get()安全取值 - 实操产出:通讯录管理小程序,支持添加、查找、删除联系人
- 前置基础:第6章元组与集合、第4-5章循环遍历、第3章
if条件判断
一、写在前面
前面几章学了列表、元组和集合,它们有一个共同特点:只能存一列数据 。比如 ["小明", "小红", "小刚"],你知道第 0 个是"小明",但不知道这个"小明"的电话是多少、年龄多大。
现实中我们经常需要存储配对的信息 ------姓名对应电话,商品名对应价格,学号对应成绩。这种"一个键对应一个值"的结构,就是字典(dict)解决的问题。
二、什么是字典
字典是一种**键值对(key-value)**容器,用大括号 {} 创建。每个数据由"键"和"值"组成,中间用冒号分隔:
python
# 创建一个通讯录字典
contact = {"name": "小明", "phone": "13800138000", "age": 18}
print(contact)
# {'name': '小明', 'phone': '13800138000', 'age': 18}
字典的核心特点:
| 特点 | 说明 |
|---|---|
| 键唯一 | 同一个字典中键不能重复,重复赋值会覆盖 |
| 键不可变 | 键只能用 int / str / tuple 等不可变类型,不能用列表 |
| 无序(Python 3.7+保序) | Python 3.7 起字典保持插入顺序,但概念上不依赖顺序 |
| 查找快 | 通过键查找值,速度极快,不受数据量影响 |
python
# 键重复 → 后者覆盖前者
d = {"name": "小明", "name": "小红"}
print(d) # {'name': '小红'}
# 键可以用数字
scores = {1: "优秀", 2: "良好", 3: "及格"}
print(scores[1]) # 优秀
三、访问字典:通过键取值
3.1 中括号取值
python
contact = {"name": "小明", "phone": "13800138000", "age": 18}
print(contact["name"]) # 小明
print(contact["phone"]) # 13800138000
和列表用索引(数字)取值不同,字典用键取值。
3.2 键不存在会报错
python
print(contact["email"]) # ❌ KeyError: 'email'
3.3 get() 安全取值(推荐)
用 get() 方法,键不存在时返回 None(或指定的默认值),不会报错:
python
contact = {"name": "小明", "phone": "13800138000", "age": 18}
print(contact.get("email")) # None
print(contact.get("email", "未填写")) # 未填写
print(contact.get("name")) # 小明
新手建议:不确定键是否存在时,一律用
get(),避免程序崩溃。
四、增删改查
4.1 添加:新键赋值
python
contact = {"name": "小明", "age": 18}
# 添加新键值对
contact["phone"] = "13800138000"
contact["email"] = "xm@qq.com"
print(contact)
# {'name': '小明', 'age': 18, 'phone': '13800138000', 'email': 'xm@qq.com'}
4.2 修改:已有键重新赋值
python
contact = {"name": "小明", "age": 18}
# 修改已有键的值
contact["age"] = 19
print(contact) # {'name': '小明', 'age': 19}
添加和修改语法完全一样:
字典[键] = 值。键不存在就添加,键已存在就修改。
4.3 删除:del / pop()
python
contact = {"name": "小明", "age": 18, "phone": "13800138000"}
# del 删除指定键
del contact["phone"]
print(contact) # {'name': '小明', 'age': 18}
# pop() 删除并返回被删除的值
removed = contact.pop("age")
print(removed) # 18
print(contact) # {'name': '小明'}
4.4 清空:clear()
python
contact = {"name": "小明", "age": 18}
contact.clear()
print(contact) # {}
五、遍历字典
字典有三种遍历方式,根据需要选择:
5.1 遍历所有键:keys()
python
scores = {"语文": 85, "数学": 90, "英语": 78}
for key in scores.keys():
print(key)
运行结果:
语文
数学
英语
5.2 遍历所有值:values()
python
for value in scores.values():
print(value)
运行结果:
85
90
78
5.3 遍历键值对:items()(最常用)
python
for key, value in scores.items():
print(f"{key}:{value} 分")
运行结果:
语文:85 分
数学:90 分
英语:78 分
items()返回键值对元组,用两个变量分别接收,是最常用的遍历方式。
5.4 检查键是否存在
python
scores = {"语文": 85, "数学": 90}
print("语文" in scores) # True
print("物理" in scores) # False
if "物理" in scores:
print(scores["物理"])
else:
print("没有物理成绩")
六、嵌套字典
字典的值可以是任何类型,包括另一个字典。这就是嵌套字典:
python
# 通讯录:每个人是一个字典
contacts = {
"小明": {"phone": "13800138000", "age": 18, "city": "北京"},
"小红": {"phone": "13900139000", "age": 20, "city": "上海"},
}
# 访问嵌套数据
print(contacts["小明"]["phone"]) # 13800138000
print(contacts["小红"]["city"]) # 上海
# 遍历嵌套字典
for name, info in contacts.items():
print(f"{name}:电话{info['phone']},{info['age']}岁,{info['city']}")
运行结果:
小明:电话13800138000,18岁,北京
小红:电话13900139000,20岁,上海
嵌套字典是组织结构化数据的常见方式,后面做项目、处理 JSON 数据时经常用到。
七、字典常用方法速查
| 方法 | 作用 | 示例 |
|---|---|---|
dict.get(key, default) |
安全取值,键不存在返回默认值 | d.get("email", "无") |
dict.keys() |
返回所有键 | d.keys() |
dict.values() |
返回所有值 | d.values() |
dict.items() |
返回所有键值对 | d.items() |
dict.pop(key) |
删除键并返回值 | d.pop("age") |
dict.update(other) |
合并另一个字典 | d.update({"city": "北京"}) |
dict.clear() |
清空字典 | d.clear() |
len(dict) |
返回键值对数量 | len(d) |
python
# update() 合并字典
d1 = {"name": "小明", "age": 18}
d2 = {"age": 19, "city": "北京"}
d1.update(d2)
print(d1) # {'name': '小明', 'age': 19, 'city': '北京'}
update()合并时,如果键重复,后者覆盖前者。
八、Scratch 积木对照
| Scratch | Python | 说明 |
|---|---|---|
| Scratch 列表(只能存一列值) | 字典 {key: value} |
字典用键值对存储,每个值都有名字标签 |

python
# Scratch 列表只能存一列 → Python 字典存配对数据
# Scratch: 列表 [小明, 小红, 小刚] ← 只有名字
# Python: 字典可以存更多信息
contacts = {"小明": 18, "小红": 20, "小刚": 19}
Scratch 的列表只能存一列数据(比如一列名字),想同时存名字和电话就很别扭。Python 字典用"键值对"解决这个问题------键是标签,值是数据,一一对应,查找方便。可以把它想象成通讯录:用名字查找电话。
九、综合实战:通讯录管理小程序
综合运用字典的创建、增删改查、遍历、嵌套字典、条件判断:
python
# ========================================
# 通讯录管理小程序
# ========================================
# 初始化通讯录(嵌套字典)
contacts = {
"小明": {"phone": "13800138000", "age": 18, "city": "北京"},
"小红": {"phone": "13900139000", "age": 20, "city": "上海"},
}
print("=" * 40)
print(" 通讯录管理系统 v1.0")
print("=" * 40)
while True:
print()
print("1. 查看所有联系人")
print("2. 查找联系人")
print("3. 添加联系人")
print("4. 删除联系人")
print("5. 退出")
print("-" * 30)
choice = input("请选择操作(1-5):")
if choice == "1":
# 遍历所有联系人
if len(contacts) == 0:
print("通讯录为空")
else:
print(f"\n共 {len(contacts)} 位联系人:")
for name, info in contacts.items():
print(f" {name} | {info['phone']} | {info['age']}岁 | {info['city']}")
elif choice == "2":
# 查找联系人
name = input("请输入姓名:")
if name in contacts:
info = contacts[name]
print(f"姓名:{name}")
print(f"电话:{info['phone']}")
print(f"年龄:{info['age']}")
print(f"城市:{info['city']}")
else:
print(f"未找到联系人:{name}")
elif choice == "3":
# 添加联系人
name = input("请输入姓名:")
if name in contacts:
print(f"联系人 {name} 已存在,请勿重复添加")
else:
phone = input("请输入电话:")
age = int(input("请输入年龄:"))
city = input("请输入城市:")
contacts[name] = {"phone": phone, "age": age, "city": city}
print(f"✅ 联系人 {name} 添加成功")
elif choice == "4":
# 删除联系人
name = input("请输入要删除的姓名:")
if name in contacts:
removed = contacts.pop(name)
print(f"✅ 已删除:{name}(电话:{removed['phone']})")
else:
print(f"未找到联系人:{name}")
elif choice == "5":
print("再见!")
break
else:
print("⚠️ 无效选择,请输入 1-5")
运行效果:
========================================
通讯录管理系统 v1.0
========================================
1. 查看所有联系人
2. 查找联系人
3. 添加联系人
4. 删除联系人
5. 退出
------------------------------
请选择操作(1-5):1
共 2 位联系人:
小明 | 13800138000 | 18岁 | 北京
小红 | 13900139000 | 20岁 | 上海
分步拆解:
- 嵌套字典存储 :每个联系人是一个字典,包含
phone/age/city三个字段,外层字典以姓名为键 - 查看所有 :
items()遍历,用f-string格式化输出 - 查找 :
in检查键是否存在,存在则取出嵌套字典逐项输出 - 添加:先检查是否已存在,避免覆盖;不存在则创建新嵌套字典
- 删除 :
pop()删除并返回被删数据,方便确认删除内容 whileTrue循环 :让程序持续运行直到用户选择退出(while循环第5章已学)
十、常见报错速查表
| 报错信息 | 出现场景 | 原因 | 解决方法 |
|---|---|---|---|
KeyError: 'xxx' |
字典取值 | 用 d[key] 访问不存在的键 |
改用 d.get(key) 或先用 in 检查 |
TypeError: unhashable type: 'list' |
字典创建 | 用列表做键,如 {[1,2]: "值"} |
键只能用不可变类型(str/int/tuple) |
AttributeError: 'dict' object has no attribute 'xxx' |
调用方法 | 方法名拼写错误或不存在 | 查阅字典方法表,确认方法名 |
ValueError |
pop() |
d.pop("不存在的键") |
pop 传入默认值:d.pop("键", None) |
十二、本章小结
本章你掌握了 Python 字典的完整使用:
- 创建字典 ------大括号
{},键值对用冒号分隔,键唯一且不可变 - 访问取值 ------
d[key]直接取值(键不存在会报错),d.get(key)安全取值(推荐) - 增删改查 ------
d[key] = value添加或修改,del d[key]/d.pop(key)删除 - 遍历字典 ------
keys()遍历键,values()遍历值,items()遍历键值对(最常用) - 嵌套字典------字典的值可以是另一个字典,适合存储结构化数据
字典是 Python 中最常用的数据结构之一,后面做项目、处理 JSON、操作数据库返回结果时都会大量用到。
往期回顾:
零基础学 Python 第1章 | 全平台装环境 + VS Code 配置 + 第一个 Hello World
零基础学 Python 第2章 | print 输出 + 变量赋值 + input 交互输入
零基础学 Python 第3章 | 条件判断:if / elif / else
零基础学 Python 第 4 章 | for 循环与 range():让程序帮你重复干活
零基础学 Python 第 5 章 | while 循环与循环嵌套:让程序看着条件自己干活
零基础学 Python 第 6 章 | 元组与集合:不可变数据与自动去重
下一章预告:前面学的列表、元组、集合、字典都是容器,但数据里的文字本身也有很多操作技巧。下一章学习字符串的切片、常用方法和三种格式化输出,把文本处理能力拉满。
文末资源区
| 资源 | 说明 |
|---|---|
| Python 官方文档 - 字典 | https://docs.python.org/3/tutorial/datastructures.html#dictionaries |
Python 官方文档 - dict 方法 |
https://docs.python.org/3/library/stdtypes.html#mapping-types-dict |
| 本章完整源码 | chapter7_all.py(关注梅雅达编程笔记,评论领资料) |
每节课都配套课后练习题与完整源码。代码报错、看不懂知识点,可在评论区粘贴问题,逐一解答!
欢迎关注梅雅达编程笔记,持续分享Python零基础学习内容

