Python 字典
字典是Python中最强大的数据类型之一,它就像一本真正的字典一样,每个"单词"(键)对应一个"解释"(值)。字典就像你手机里的通讯录,每个名字(键)对应一个电话号码(值)。
字典的核心概念
字典由键(key)-值(value)对组成:
- 键(key): 必须是不可变类型(字符串、数字、元组)
- 值(value): 可以是任何Python对象
- 字典中的键是唯一的,值可以重复
- 字典是无序的(Python 3.6+开始有序)
姓名
"小明"
年龄
12
爱好
["看书", "编程", "踢足球"]
成绩
{"语文":95, "数学":98, "英语":92}
创建字典
创建字典有多种方式:
# 方法1: 使用花括号 {}
student = {
"姓名": "小明",
"年龄": 12,
"年级": 6
}
# 方法2: 使用 dict() 函数
student = dict(姓名="小明", 年龄=12, 年级=6)
# 方法3: 列表转字典(使用 zip())
keys = ["姓名", "年龄", "年级"]
values = ["小明", 12, 6]
student = dict(zip(keys, values))
# 创建空字典
empty_dict = {}
# 或
empty_dict = dict()
student = {
"姓名": "小明",
"年龄": 12,
"年级": 6
}
# 方法2: 使用 dict() 函数
student = dict(姓名="小明", 年龄=12, 年级=6)
# 方法3: 列表转字典(使用 zip())
keys = ["姓名", "年龄", "年级"]
values = ["小明", 12, 6]
student = dict(zip(keys, values))
# 创建空字典
empty_dict = {}
# 或
empty_dict = dict()
重要注意事项
- 字典的键必须是不可变类型(不能使用列表作为键)
- 键在字典中是唯一的,如果重复,后面的值会覆盖前面的
- 字典的值可以是任何类型 - 数字、字符串、列表、甚至另一个字典!
访问字典元素
通过键来访问字典中的值:
student = {
"姓名": "小明",
"年龄": 12,
"年级": 6
}
# 方法1: 使用方括号 []
name = student["姓名"] # "小明"
# 方法2: 使用 get() 方法(更安全)
age = student.get("年龄") # 12
# 访问不存在的键
# height = student["身高"] # 会报错 KeyError
height = student.get("身高") # 返回 None
height = student.get("身高", 150) # 设置默认值 150
# 检查键是否存在
if "年级" in student:
print("年级信息存在")
"姓名": "小明",
"年龄": 12,
"年级": 6
}
# 方法1: 使用方括号 []
name = student["姓名"] # "小明"
# 方法2: 使用 get() 方法(更安全)
age = student.get("年龄") # 12
# 访问不存在的键
# height = student["身高"] # 会报错 KeyError
height = student.get("身高") # 返回 None
height = student.get("身高", 150) # 设置默认值 150
# 检查键是否存在
if "年级" in student:
print("年级信息存在")
添加和修改元素
添加新键值对
直接赋值给新键
student["身高"] = 155
修改值
重新赋值给已有键
student["年龄"] = 13
更新字典
使用update()方法
student.update({"爱好":"编程"})
student = {"姓名": "小明", "年龄": 12}
# 添加新元素
student["年级"] = 6
student["爱好"] = ["编程", "足球"]
# 修改元素
student["年龄"] = 13 # 修改年龄
# 使用 update() 添加多个元素
student.update({
"身高": 155,
"体重": 45
})
print(student)
# 输出: {'姓名': '小明', '年龄': 13, '年级': 6, '爱好': ['编程', '足球'], '身高': 155, '体重': 45}
# 添加新元素
student["年级"] = 6
student["爱好"] = ["编程", "足球"]
# 修改元素
student["年龄"] = 13 # 修改年龄
# 使用 update() 添加多个元素
student.update({
"身高": 155,
"体重": 45
})
print(student)
# 输出: {'姓名': '小明', '年龄': 13, '年级': 6, '爱好': ['编程', '足球'], '身高': 155, '体重': 45}
删除元素
del 关键字
删除指定的键值对
del student["体重"]
pop() 方法
删除并返回指定键的值
age = student.pop("年龄")
clear() 方法
清空整个字典
student.clear()
student = {"姓名": "小明", "年龄": 13, "年级": 6}
# 删除指定的键值对
del student["年龄"]
# 使用 pop() 删除并获取值
grade = student.pop("年级")
print(f"年级: {grade}") # 输出: 年级: 6
# popitem() 删除最后一个键值对(Python 3.7+)
last_item = student.popitem()
print(last_item) # 输出: ('姓名', '小明')
# 清空字典
student.clear()
print(student) # 输出: {}
# 删除指定的键值对
del student["年龄"]
# 使用 pop() 删除并获取值
grade = student.pop("年级")
print(f"年级: {grade}") # 输出: 年级: 6
# popitem() 删除最后一个键值对(Python 3.7+)
last_item = student.popitem()
print(last_item) # 输出: ('姓名', '小明')
# 清空字典
student.clear()
print(student) # 输出: {}
遍历字典
遍历字典有多种方式:
student = {
"姓名": "小明",
"年龄": 13,
"年级": 6,
"爱好": ["编程", "足球"]
}
# 遍历所有键
print("键:")
for key in student:
print(key)
# 遍历所有值
print("\n值:")
for value in student.values():
print(value)
# 同时遍历键和值
print("\n键和值:")
for key, value in student.items():
print(f"{key}: {value}")
# 遍历键的另一种方式
for key in student.keys():
print(key)
"姓名": "小明",
"年龄": 13,
"年级": 6,
"爱好": ["编程", "足球"]
}
# 遍历所有键
print("键:")
for key in student:
print(key)
# 遍历所有值
print("\n值:")
for value in student.values():
print(value)
# 同时遍历键和值
print("\n键和值:")
for key, value in student.items():
print(f"{key}: {value}")
# 遍历键的另一种方式
for key in student.keys():
print(key)
字典方法
Python字典提供了许多有用的方法:
copy()
创建字典的浅拷贝
new_dict = old_dict.copy()
keys()
返回字典所有键
keys = student.keys()
values()
返回字典所有值
values = student.values()
items()
返回键值对元组
items = student.items()
setdefault()
安全获取值,如不存在则设置默认值
value = student.setdefault("身高", 150)
update()
合并两个字典
student.update(new_info)
实际应用示例
示例1:学生管理系统
students = {
"001": {"姓名": "小明", "年龄": 12, "成绩": {"语文":90, "数学":95}},
"002": {"姓名": "小红", "年龄": 11, "成绩": {"语文":95, "数学":92}}
}
# 添加新学生
students["003"] = {
"姓名": "小刚",
"年龄": 13,
"成绩": {"语文":88, "数学":90}
}
# 修改学生成绩
students["001"]["成绩"]["数学"] = 98
# 计算平均分
def calculate_average(student_id):
scores = students[student_id]["成绩"].values()
return sum(scores) / len(scores)
# 打印所有学生信息
for student_id, info in students.items():
avg = calculate_average(student_id)
print(f"学号: {student_id}, 姓名: {info['姓名']}, 平均分: {avg:.1f}")
"001": {"姓名": "小明", "年龄": 12, "成绩": {"语文":90, "数学":95}},
"002": {"姓名": "小红", "年龄": 11, "成绩": {"语文":95, "数学":92}}
}
# 添加新学生
students["003"] = {
"姓名": "小刚",
"年龄": 13,
"成绩": {"语文":88, "数学":90}
}
# 修改学生成绩
students["001"]["成绩"]["数学"] = 98
# 计算平均分
def calculate_average(student_id):
scores = students[student_id]["成绩"].values()
return sum(scores) / len(scores)
# 打印所有学生信息
for student_id, info in students.items():
avg = calculate_average(student_id)
print(f"学号: {student_id}, 姓名: {info['姓名']}, 平均分: {avg:.1f}")
示例2:游戏角色属性
# 游戏角色属性
character = {
"name": "勇敢战士",
"level": 5,
"health": 100,
"attack": 25,
"defense": 15,
"skills": ["劈砍", "格挡", "冲锋"]
}
# 升级角色
def level_up(char):
char["level"] += 1
char["health"] += 20
char["attack"] += 5
char["defense"] += 3
print(f"{char['name']}升级到{char['level']}级!")
# 学习新技能
def learn_skill(char, skill):
if skill not in char["skills"]:
char["skills"].append(skill)
print(f"{char['name']}学会了新技能: {skill}")
else:
print(f"{char['name']}已经会技能: {skill}")
# 使用角色
level_up(character)
learn_skill(character, "旋风斩")
learn_skill(character, "格挡") # 重复技能
print("\n角色最终属性:")
for key, value in character.items():
print(f"{key}: {value}")
character = {
"name": "勇敢战士",
"level": 5,
"health": 100,
"attack": 25,
"defense": 15,
"skills": ["劈砍", "格挡", "冲锋"]
}
# 升级角色
def level_up(char):
char["level"] += 1
char["health"] += 20
char["attack"] += 5
char["defense"] += 3
print(f"{char['name']}升级到{char['level']}级!")
# 学习新技能
def learn_skill(char, skill):
if skill not in char["skills"]:
char["skills"].append(skill)
print(f"{char['name']}学会了新技能: {skill}")
else:
print(f"{char['name']}已经会技能: {skill}")
# 使用角色
level_up(character)
learn_skill(character, "旋风斩")
learn_skill(character, "格挡") # 重复技能
print("\n角色最终属性:")
for key, value in character.items():
print(f"{key}: {value}")
字典 vs 列表
| 特性 | 字典 | 列表 |
|---|---|---|
| 访问方式 | 通过键访问 | 通过索引访问 |
| 存储内容 | 键值对 | 有序元素序列 |
| 元素顺序 | Python 3.7+ 有序 | 有序 |
| 查找速度 | 非常快(基于哈希) | 较慢(需要遍历) |
| 索引访问 | 不支持数字索引 | 支持 |
| 使用场景 | 有逻辑关联的数据 | 有序数据序列 |
| 语法 | {key: value} | [item1, item2] |
字典练习
尝试解决这些练习来巩固你的字典知识:
编程挑战
练习1:单词计数器
编写一个程序,统计一段文本中每个单词出现的次数
- 将文本分解为单词列表
- 使用字典存储每个单词的出现次数
- 输出每个单词及其出现次数
示例文本:"苹果 香蕉 苹果 橙子 香蕉 苹果"
输出:
苹果: 3
香蕉: 2
橙子: 1
练习2:学生成绩管理
创建一个学生成绩管理系统:
- 存储学生姓名和成绩(语文、数学、英语)
- 能够添加、删除、修改学生信息
- 计算每个学生的平均分
- 找出平均分最高的学生
练习3:电话簿
创建一个简单的电话簿程序:
- 添加联系人(姓名、电话)
- 查找联系人电话
- 删除联系人
- 显示所有联系人
练习4:词汇翻译器
创建一个中英文单词翻译器:
- 存储中英文单词对应关系
- 用户输入中文单词,输出英文翻译
- 用户输入英文单词,输出中文翻译
- 能够添加新的单词翻译
总结
关键知识点回顾
✓ 字典特性: 键值对、键唯一、键不可变、无序(Python 3.7+有序)
✓ 创建字典: {}, dict(), dict(zip(keys, values))
✓ 访问元素: dict[key], dict.get(key, default)
✓ 修改添加: dict[key] = value, update()
✓ 删除元素: del, pop(), popitem(), clear()
✓ 遍历字典: keys(), values(), items()
✓ 常用方法: copy(), setdefault()
✓ 使用场景: 关联数据、快速查找、配置信息
字典小测验
看看你是否掌握了这些知识:
- 字典的键有什么限制?
- 如何安全地获取字典值(避免KeyError)?
- 如何同时遍历字典的键和值?
- 字典和列表在访问元素方面有什么区别?
- update()方法有什么作用?