第十五课:玩转你的“标签库” – 字典进阶与综合应用
- 时长: 90 分钟
- 教学目标:
- 复习字典的基本操作(创建、通过键访问/修改、添加/删除键值对、遍历键/值/项目)。
- 学习更安全地访问字典中的值(使用
.get()
方法)。 - 掌握如何使用循环遍历字典的键值对,并结合条件判断进行筛选和统计。
- 练习将字典与列表、循环、条件判断等结构结合,解决需要通过“标签”查找数据的问题。
- 通过综合练习,巩固字典的使用,并理解何时选择字典(需要通过唯一标识查找数据)而不是列表。
课程内容
1. 复习与引入 (10 分钟)
- 复习: 快速回顾上一节课字典的基础知识:字典是用
{}
创建的,它存储键值对,通过键来访问值,键是唯一的且不可变,列表用索引,字典用键。如何创建、访问、修改、添加、删除键值对,如何遍历键、值、键值对。 - 提出问题: 老师提问:“上次我们知道了可以用名字(键)查分数(值)。但如果我查一个字典里根本没有的名字怎么办?比如查‘小芳’的分数,我们的程序就会报错。有没有更‘温柔’的方法,让程序不报错,而是告诉我们‘没有这个人’或者给一个默认值?”
- 引出
.get()
方法: 这就需要学习字典更安全、更灵活的访问方式。 - 引出综合应用: 我们已经知道如何用循环遍历列表并筛选,那怎么遍历字典,找出分数及格的学生?怎么找出价格低于 5 元的商品?这些就需要把循环和条件判断和字典结合起来。
2. 更安全地访问字典的值 – .get()
(15 分钟)
[]
访问的缺点: 使用方括号字典[键]
访问值很方便,但是如果键不存在,程序就会停止并报错(KeyError)。student_scores = {"小明": 85, "小红": 95} # print(student_scores["小刚"]) # 运行这里会报错! print("程序到这里就停了。")
.get()
方法: 字典提供了一个.get(键, 默认值)
方法,用来获取指定键的值。- 如果键存在,它就返回对应的值。
- 如果键不存在,它不会报错,而是返回
None
(默认值,表示“空”),或者返回你指定的那个“默认值”。
- 语法:
字典变量.get(键)
或字典变量.get(键, 默认值)
。student_scores = {"小明": 85, "小红": 95} # 访问存在的键 score_xiaoming = student_scores.get("小明") print("小明的分数是:", score_xiaoming) # 结果是 85 # 访问不存在的键 (返回 None) score_xiaogang = student_scores.get("小刚") print("小刚的分数是:", score_xiaogang) # 结果是 None # 访问不存在的键,并指定默认值 (例如,如果找不到,就认为是 0 分) score_xiaoli = student_scores.get("小丽", 0) print("小丽的分数是:", score_xiaoli) # 结果是 0 # 结合 if 判断 if student_scores.get("小芳") is None: # 判断返回的是不是 None print("字典中没有小芳的信息。")
(可以简单解释
is None
的用法,判断一个值是不是 None) - 动手实践: 学生创建一个字典,尝试用
[]
访问一个不存在的键,看到报错。 然后使用.get()
方法访问存在的键、不存在的键(不带默认值和带默认值),观察结果。
3. 结合循环和条件判断处理字典 (20 分钟)
- 遍历键值对
.items()
和条件判断: 我们最常用for key, value in dictionary.items():
来遍历字典的每一个键值对。在循环体内部,可以使用if
语句根据键或值进行判断、筛选或统计。 - 示例:筛选分数及格的学生:
print("--- 找出及格的学生 ---") student_scores = {"小明": 85, "小红": 95, "小刚": 58, "小丽": 70, "小强": 45} pass_score = 60 print(f"及格分数线:{pass_score}分") print("及格的学生有:") for name, score in student_scores.items(): if score >= pass_score: print(f"{name} ({score} 分)")
- 示例:查找特定价格的商品:
print("--- 找出价格低于 5 元的商品 ---") product_prices = {"苹果": 2.5, "面包": 5.0, "鸡蛋": 1.2, "牛奶": 3.0, "饼干": 6.5} print("价格低于 5 元的商品:") for product, price in product_prices.items(): if price < 5.0: print(f"{product}: {price} 元")
- 示例:统计符合条件的数量:
print("--- 统计分数超过 90 分的学生数量 ---") student_scores = {"小明": 85, "小红": 95, "小刚": 58, "小丽": 70, "小强": 92} excellent_count = 0 for name, score in student_scores.items(): if score > 90: excellent_count = excellent_count + 1 # 或者 excellent_count += 1 print(f"分数超过 90 分的学生有:{excellent_count} 个")
- 动手实践: 学生编写代码,在一个字典中找出所有值大于某个数的键值对并打印。 在一个字典中,统计所有键的长度大于某个数的键值对有多少对。
4. 字典与列表的结合应用 (20 分钟)
- 列表中的字典: 列表的元素可以是字典。这常用于存储多个记录,每个记录是一个字典,用键值对表示一条信息的不同属性。
# 创建一个学生信息列表,每个学生是一个字典 students = [ {"name": "小明", "age": 12, "score": 85}, {"name": "小红", "age": 13, "score": 95}, {"name": "小刚", "age": 12, "score": 78} ] print(students[0]) # 访问第一个学生的信息 (一个字典) print(students[1]["name"]) # 访问第二个学生的姓名 (通过索引访问列表元素,再通过键访问字典的值)
- 字典中的列表: 字典的值可以是列表。例如,一个键对应一个列表,列表里存放多个相关的值。
# 创建一个科目及对应的分数列表的字典 student_grades = { "小明": [85, 90, 92], "小红": [95, 88, 100], "小刚": [78, 80, 85] } print(student_grades["小红"]) # 获取小红的所有分数 (一个列表) print(student_grades["小刚"][0]) # 获取小刚的第一个分数 (通过键访问字典,再通过索引访问列表元素)
- 结合遍历和条件判断处理复杂结构:
print("--- 统计每个学生的平均分 ---") student_grades = { "小明": [85, 90, 92], "小红": [95, 88, 100], "小刚": [78, 80, 85] } for name, scores_list in student_grades.items(): # 对于每一个学生 (键 name),获取他们的分数列表 (值 scores_list) total_score = sum(scores_list) average_score = total_score / len(scores_list) print(f"{name} 的平均分是:{average_score:.2f}") print("--- 找出所有年龄大于 12 岁的学生姓名 ---") students = [ {"name": "小明", "age": 12, "score": 85}, {"name": "小红", "age": 13, "score": 95}, {"name": "小刚", "age": 12, "score": 78}, {"name": "小丽", "age": 14, "score": 90} ] for student_dict in students: # 遍历列表,每个元素是学生字典 if student_dict["age"] > 12: # 访问字典中的 'age' 键进行判断 print(student_dict["name"]) # 打印学生的姓名
- 动手实践: 学生创建一个列表,里面包含几个描述商品的字典(包含商品名、价格、库存等信息)。遍历列表,找出价格低于某个值的商品信息并打印。
5. 课堂综合练习 (20 分钟)
让学生独立完成以下综合练习:
- 练习 1: 创建一个字典,模拟一个简单的商品库存:键是商品名称(字符串),值是库存数量(整数)。
- 打印出所有库存数量小于 10 的商品名称和数量。
- 让用户输入一个商品名称和一个购买数量,如果库存足够,则更新库存数量并打印“购买成功,剩余库存:[剩余数量]”;如果库存不足,打印“库存不足”。
inventory = {"铅笔": 20, "橡皮": 5, "笔记本": 15, "尺子": 8} # TODO: 打印低库存商品 # TODO: 获取用户输入商品和数量 # TODO: 检查库存并处理购买逻辑 (结合 .get() 或 in + [])
- 练习 2: 创建一个列表,其中每个元素都是一个字典,表示一道选择题:包含 ‘question’ (题目), ‘options’ (选项列表), ‘answer’ (正确答案,比如 ‘A’, ‘B’, ‘C’ 或 ‘D’)。
- 遍历这个题目列表,打印每一道题目和选项。
- (可选:可以简单实现让用户输入答案,并判断是否正确)。
questions = [ {"question": "1+1等于几?", "options": ["A. 1", "B. 2", "C. 3"], "answer": "B"}, {"question": "太阳从哪边升起?", "options": ["A. 东边", "B. 西边", "C. 南边"], "answer": "A"} # TODO: 可以再加几道题 ] # TODO: 遍历题目列表 # TODO: 打印题目和选项
6. 总结与提问 (5 分钟)
- 回顾: 回顾本节课内容:
.get()
方法的安全访问,如何结合循环和条件判断处理字典中的键值对(筛选、统计),字典与列表的相互嵌套应用,以及如何根据问题选择合适的数据结构。 - 提问:
- 使用
字典[键]
访问值有什么风险?.get()
方法有什么好处? - 如何遍历字典的所有键和值,并只打印值大于 90 的项?
- 如何表示一个班级所有学生的信息列表,每个学生有姓名、年龄、性别等多个属性?(列表里放字典)
- 如何表示一个学生的各科成绩,通过科目名称快速找到成绩?(字典的值放列表)
- 使用
- 答疑: 回答学生问题。
7. 布置课后作业 (5 分钟)
- 作业 1: 创建一个字典,存放一些国家的名称和它们的人口数量。计算并打印出所有国家的人口总数。找出并打印人口数量超过 1 亿的国家名称和人口。
- 作业 2: 编写一个程序,统计一个英文句子中每个字母出现的次数(不区分大小写,只统计字母,忽略其他符号)。使用一个字典来存储结果,键是字母,值是次数。例如句子“Hello World!”,结果字典可能是
{'h': 1, 'e': 1, 'l': 3, 'o': 2, 'w': 1, 'r': 1, 'd': 1}
。(提示:遍历字符串,使用.lower()
转换为小写,判断是否是字母,如果是,更新字典中的计数,可以使用.get(letter, 0) + 1
)。 - 作业 3: 创建一个列表,存放一些表示学生的字典,每个字典包含 ‘name’ 和 ‘score’ 键。编写一个函数
get_highest_score_student(student_list)
,接收这个列表作为参数,返回分数最高的学生的姓名和分数(可以返回一个字典或元组)。在主程序中调用函数并打印结果。 - 作业 4: (选做) 扩展课堂练习 2 的选择题程序。让用户输入答案,并判断对错,打印提示信息。可以统计用户答对了多少题,并在最后打印总得分。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)