🎯 今日目标

  • 理解字典的概念(键值对)

  • 学会创建字典和访问值

  • 掌握字典的增删改操作

  • 学会遍历字典(键、值、键值对)

  • 掌握常用字典方法: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()delclear()

  • 遍历字典(keys()values()items()

  • 检查键是否存在(in

  • 字典和列表的适用场景对比

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐