知识点概述
键值对数据结构、字典操作、字典推导式
学习Python中的字典数据结构,掌握键值对的存储和操作,这是处理结构化数据的重要工具。
详细讲解
字典基础
字典是Python中另一种重要的数据结构,用于存储键值对。字典是无序的(Python 3.7+保持插入顺序),键必须是不可变类型。
创建字典:
- 使用花括号:
dict1 = {"key": "value"} - 使用dict()函数:
dict2 = dict(name="张三", age=15) - 空字典:
empty_dict = {}或empty_dict = dict() - 字典的键必须是不可变类型(字符串、数字、元组)
- 字典的值可以是任何类型,包括列表、字典等
访问字典值:
- 通过键访问:
dict["key"](如果键不存在会引发KeyError) - 使用get()方法:
dict.get("key")(键不存在返回None) - 使用get()带默认值:
dict.get("key", "default") - 使用setdefault():如果键不存在则设置默认值并返回
- 使用in检查键是否存在:
"key" in dict
修改字典:
- 添加/修改元素:
dict["new_key"] = "value" - update()方法:合并另一个字典,重复的键会被覆盖
- setdefault()方法:如果键不存在则设置默认值
- 从Python 3.9开始可以使用
|和|=操作符合并字典
删除字典元素:
pop(key):删除指定键并返回值popitem():删除并返回最后一个键值对del dict[key]:删除指定键值对clear():清空字典del dict:删除整个字典
遍历字典:
- 遍历键:
for key in dict:或for key in dict.keys(): - 遍历值:
for value in dict.values(): - 遍历键值对:
for key, value in dict.items(): - 使用enumerate同时获取索引:
for i, (key, value) in enumerate(dict.items()):
字典推导式:
字典推导式提供了一种简洁的方法来创建字典。
- 基本语法:
{key_expr: value_expr for item in iterable} - 带条件过滤:
{key_expr: value_expr for item in iterable if condition} - 遍历两个列表创建字典:
{keys[i]: values[i] for i in range(len(keys))} - 示例:
{x: x**2 for x in range(5)}{word: len(word) for word in ["apple", "banana"]}{k: v for k, v in original_dict.items() if v > 10}
字典嵌套:
字典的值可以是任何类型,包括列表、元组甚至其他字典,这允许创建复杂的数据结构。
- 字典列表:
[{"name": "张三"}, {"name": "李四"}] - 列表字典:
{"students": ["张三", "李四"], "scores": [95, 88]} - 字典嵌套字典:
{"class1": {"teacher": "王老师"}, "class2": {"teacher": "李老师"}} - 访问嵌套字典:
dict["outer"]["inner"]
代码示例
dictionaries.py
# 字典示例
# 创建字典
student = {
"name": "张三",
"age": 15,
"grade": "八年级",
"subjects": ["数学", "语文", "英语"],
"scores": {
"数学": 95,
"语文": 88,
"英语": 92
}
}
print("学生信息:")
print(student)
# 访问字典值
print("\n=== 访问字典 ===")
print("学生姓名:", student["name"])
print("学生年龄:", student.get("age"))
print("使用get带默认值:", student.get("address", "未提供"))
# 修改字典
print("\n=== 修改字典 ===")
student["age"] = 16 # 修改值
student["school"] = "第一中学" # 添加新键值对
student.setdefault("class", "八(3)班") # 如果键不存在则设置默认值
print("修改后的学生信息:", student)
# 删除元素
print("\n=== 删除元素 ===")
removed_grade = student.pop("grade") # 删除并返回
print(f"删除的年级: {removed_grade}")
removed_item = student.popitem() # 删除最后一个键值对
print(f"删除的最后一个项: {removed_item}")
print("删除后字典:", student)
# 遍历字典
print("\n=== 遍历字典 ===")
print("遍历键:")
for key in student:
print(f" {key}: {student[key]}")
print("\n遍历值:")
for value in student.values():
print(f" {value}")
print("\n遍历键值对:")
for key, value in student.items():
print(f" {key}: {value}")
# 字典嵌套
print("\n=== 字典嵌套 ===")
classroom = {
"teacher": "王老师",
"students": [
{"name": "小明", "score": 95, "hobbies": ["篮球", "编程"]},
{"name": "小红", "score": 88, "hobbies": ["绘画", "音乐"]},
{"name": "小刚", "score": 92, "hobbies": ["足球", "阅读"]}
],
"subject": "Python编程",
"schedule": {
"周一": "14:00-15:30",
"周三": "14:00-15:30",
"周五": "10:00-11:30"
}
}
print("班级信息:")
print(f"老师: {classroom['teacher']}")
print(f"科目: {classroom['subject']}")
print("\n学生成绩:")
for student in classroom["students"]:
print(f" {student['name']}: {student['score']}分")
print("\n课程安排:")
for day, time in classroom["schedule"].items():
print(f" {day}: {time}")
# 字典推导式
print("\n=== 字典推导式 ===")
numbers = [1, 2, 3, 4, 5]
squares_dict = {x: x**2 for x in numbers}
print("数字平方字典:", squares_dict)
words = ["apple", "banana", "cherry", "date"]
length_dict = {word: len(word) for word in words}
print("单词长度字典:", length_dict)
# 过滤字典
scores = {"数学": 95, "语文": 88, "英语": 92, "物理": 78, "化学": 85}
good_scores = {subject: score for subject, score in scores.items() if score >= 85}
print("良好成绩科目:", good_scores)
# 字典合并
print("\n=== 字典合并 ===")
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4} # 注意键"b"重复
# 方法1: update()
dict3 = dict1.copy()
dict3.update(dict2)
print("update()合并:", dict3)
# 方法2: **操作符 (Python 3.5+)
dict4 = {**dict1, **dict2}
print("**操作符合并:", dict4)
# 方法3: | 操作符 (Python 3.9+)
# dict5 = dict1 | dict2
# print("| 操作符合并:", dict5)
# 字典常用方法
print("\n=== 字典常用方法 ===")
inventory = {"苹果": 10, "香蕉": 5, "橙子": 8, "葡萄": 15}
print("库存字典:", inventory)
print("\n所有键:", list(inventory.keys()))
print("所有值:", list(inventory.values()))
print("所有键值对:", list(inventory.items()))
print("\n苹果数量:", inventory.get("苹果", 0))
print("梨子数量:", inventory.get("梨子", 0))
inventory_copy = inventory.copy()
print("字典副本:", inventory_copy)
print("\n清空字典...")
inventory.clear()
print("清空后:", inventory)
输出结果:
学生信息:
{'name': '张三', 'age': 15, 'grade': '八年级', 'subjects': ['数学', '语文', '英语'], 'scores': {'数学': 95, '语文': 88, '英语': 92}}
=== 访问字典 ===
学生姓名: 张三
学生年龄: 15
使用get带默认值: 未提供
=== 修改字典 ===
修改后的学生信息: {'name': '张三', 'age': 16, 'grade': '八年级', 'subjects': ['数学', '语文', '英语'], 'scores': {'数学': 95, '语文': 88, '英语': 92}, 'school': '第一中学', 'class': '八(3)班'}
=== 删除元素 ===
删除的年级: 八年级
删除的最后一个项: ('class', '八(3)班')
删除后字典: {'name': '张三', 'age': 16, 'subjects': ['数学', '语文', '英语'], 'scores': {'数学': 95, '语文': 88, '英语': 92}, 'school': '第一中学'}
=== 遍历字典 ===
遍历键:
name: 张三
age: 16
subjects: ['数学', '语文', '英语']
scores: {'数学': 95, '语文': 88, '英语': 92}
school: 第一中学
遍历值:
张三
16
['数学', '语文', '英语']
{'数学': 95, '语文': 88, '英语': 92}
第一中学
遍历键值对:
name: 张三
age: 16
subjects: ['数学', '语文', '英语']
scores: {'数学': 95, '语文': 88, '英语': 92}
school: 第一中学
=== 字典嵌套 ===
班级信息:
老师: 王老师
科目: Python编程
学生成绩:
小明: 95分
小红: 88分
小刚: 92分
课程安排:
周一: 14:00-15:30
周三: 14:00-15:30
周五: 10:00-11:30
=== 字典推导式 ===
数字平方字典: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
单词长度字典: {'apple': 5, 'banana': 6, 'cherry': 6, 'date': 4}
良好成绩科目: {'数学': 95, '英语': 92, '化学': 85}
=== 字典合并 ===
update()合并: {'a': 1, 'b': 3, 'c': 4}
**操作符合并: {'a': 1, 'b': 3, 'c': 4}
=== 字典常用方法 ===
库存字典: {'苹果': 10, '香蕉': 5, '橙子': 8, '葡萄': 15}
所有键: ['苹果', '香蕉', '橙子', '葡萄']
所有值: [10, 5, 8, 15]
所有键值对: [('苹果', 10), ('香蕉', 5), ('橙子', 8), ('葡萄', 15)]
苹果数量: 10
梨子数量: 0
字典副本: {'苹果': 10, '香蕉': 5, '橙子': 8, '葡萄': 15}
清空字典...
清空后: {}
学习提示
1
字典的键必须是不可变类型(字符串、数字、元组)。
2
使用get()方法访问字典可以避免KeyError异常。
3
字典推导式是创建字典的简洁方法,但复杂的推导式可能降低可读性。
4
字典在Python 3.7+中保持插入顺序,但在之前版本中是无序的。
练习题
练习 1
中等
创建一个字典存储学生信息(姓名、年龄、成绩),并实现查询功能。
使用字典存储信息,通过输入的学生姓名查询。
练习 2
中等
编写一个函数,统计字符串中每个字符出现的次数。
遍历字符串,使用字典统计每个字符出现的次数。
练习 3
困难
使用字典推导式创建1-10的数字及其立方的字典。
字典推导式格式:{x: x**3 for x in range(1, 11)}
练习 4
困难
合并两个字典,处理重复键的情况(如取平均值)。
先合并,然后对重复键的值进行特殊处理。
知识点总结
本课要点:
- 掌握字典的创建和基本操作
- 熟练使用字典的增删改查方法
- 理解字典的遍历方式
- 学会使用字典推导式创建新字典