Python字典编程题精粹:新手必备的实战演练与深度解析179
哈喽,各位编程路上的探索者们!我是你们的中文知识博主。今天,我们要深入探讨Python编程中一个极其强大且无处不在的数据结构——字典(Dictionary)。如果你对Python字典还停留在“知道有这么个东西”的阶段,或者在实际编程中总是感觉用得不够顺手,那么恭喜你,这篇文章正是为你量身定制的!
我们都知道,Python的世界里充满了各种高效处理数据的方法。而字典,无疑是其中的“瑞士军刀”。它以键值对(key-value pair)的形式存储数据,提供了极速的数据查找能力,让我们的程序在处理复杂数据时游刃有余。从爬虫抓取的数据解析到后端API的数据存储,从配置文件管理到小型数据库模拟,字典的身影无处不在。掌握它,你就能解锁更多编程技能树上的节点,让你的代码更加优雅、高效。
但是,光说不练假把式。理论知识固然重要,但真正的提升,往往来自于亲手解决问题。因此,今天我将通过一系列精心设计的“课后编程题”,带大家从实践中领悟字典的奥秘。每一道题都将包含:清晰的题目描述、详细的思路分析、可运行的参考代码,以及深入浅出的代码解析。无论你是编程新手,还是希望巩固基础的老手,都能从中获益。准备好了吗?让我们一起开启这场字典的实战之旅吧!
一、字典基础回顾:温故而知新
在开始实战之前,我们先快速回顾一下字典的一些基本概念和常用操作。这就像是武林高手在比武前,先检查一下自己的兵器是否锋利。
1. 创建字典:# 方法一:使用大括号 {}
student = {"name": "张三", "age": 20, "major": "计算机科学"}
# 方法二:使用 dict() 构造函数
teacher = dict(name="李四", age=35, subject="数学")
# 空字典
empty_dict = {}
2. 访问元素:# 通过键访问值(如果键不存在会报错 KeyError)
print(student["name"]) # 输出: 张三
# 使用 .get() 方法访问(如果键不存在返回 None 或指定默认值,不会报错)
print(("age")) # 输出: 20
print(("gender", "未知")) # 输出: 未知
3. 添加/修改元素:# 添加新键值对
student["gender"] = "男"
print(student) # 输出: {'name': '张三', 'age': 20, 'major': '计算机科学', 'gender': '男'}
# 修改已有键的值
student["age"] = 21
print(student) # 输出: {'name': '张三', 'age': 21, 'major': '计算机科学', 'gender': '男'}
4. 删除元素:# 使用 del 关键字
del student["major"]
print(student) # 输出: {'name': '张三', 'age': 21, 'gender': '男'}
# 使用 .pop() 方法(返回被删除的值,如果键不存在可指定默认值)
age_deleted = ("age")
print(age_deleted) # 输出: 21
print(student) # 输出: {'name': '张三', 'gender': '男'}
# 清空字典
()
print(student) # 输出: {}
5. 遍历字典:# 遍历键
my_dict = {"apple": 1, "banana": 2, "cherry": 3}
for key in my_dict:
print(key)
# 遍历值
for value in ():
print(value)
# 遍历键值对 (最常用)
for key, value in ():
print(f"{key}: {value}")
有了这些基础知识垫底,我们就可以开始迎接挑战了!
二、字典编程题实战:逐个击破,提升技能!
题目一:学生成绩管理系统初步
题面:
假设你需要为班级里的学生创建一个简单的成绩管理系统。每个学生有姓名和对应的多门课程成绩。请你设计一个Python程序:
创建一个字典,存储至少3名学生的姓名及其各科成绩(例如:语文、数学、英语)。成绩以列表形式存储。
根据学生姓名查找并打印该学生的所有成绩。
计算并打印某个学生的平均成绩。
添加一门新课程“物理”给所有学生,并为每个学生设置一个初始成绩(例如:85分)。
思路分析:
这个题目非常适合用字典来存储。学生姓名为键,值可以是一个包含各科成绩的字典(嵌套字典),或者一个包含课程名和成绩的列表的列表。为了方便扩展,嵌套字典是更好的选择。
步骤1:主字典的键是学生姓名,值是另一个字典,这个内层字典的键是课程名,值是成绩。
步骤2:根据输入的学生姓名,使用 `dict[key]` 或 `(key)` 访问内层字典,然后遍历打印。
步骤3:获取学生的成绩字典,使用 `values()` 方法获取所有成绩,然后计算平均值。
步骤4:遍历主字典,对每个学生的内层成绩字典添加新的键值对。
参考代码:# 1. 创建学生成绩字典
student_grades = {
"小明": {"语文": 90, "数学": 85, "英语": 92},
"小红": {"语文": 88, "数学": 91, "英语": 87},
"小刚": {"语文": 78, "数学": 76, "英语": 80}
}
print("原始学生成绩:")
for name, grades in ():
print(f"{name}: {grades}")
print("-" * 30)
# 2. 根据学生姓名查找并打印成绩
search_name = "小红"
if search_name in student_grades:
print(f"{search_name} 的成绩是:")
for subject, score in student_grades[search_name].items():
print(f" {subject}: {score}")
else:
print(f"未找到学生 {search_name}")
print("-" * 30)
# 3. 计算并打印某个学生的平均成绩
calc_name = "小明"
if calc_name in student_grades:
scores = student_grades[calc_name].values()
average_score = sum(scores) / len(scores)
print(f"{calc_name} 的平均成绩是: {average_score:.2f}")
else:
print(f"未找到学生 {calc_name}")
print("-" * 30)
# 4. 添加一门新课程“物理”并设置初始成绩
new_subject = "物理"
initial_score = 85
for name in student_grades:
student_grades[name][new_subject] = initial_score
print(f"添加 {new_subject} 课程后的学生成绩:")
for name, grades in ():
print(f"{name}: {grades}")
print("-" * 30)
代码解析:
我们首先定义了一个 `student_grades` 字典,它的键是学生姓名字符串,值是另一个字典。这个内层字典以课程名为键,成绩为值为整数。
查找成绩时,我们使用 `in` 关键字检查学生是否存在,然后通过 `student_grades[search_name]` 获取该学生的成绩字典,并遍历打印。
计算平均分时,通过 `student_grades[calc_name].values()` 获取所有成绩的列表,然后使用 `sum()` 和 `len()` 函数计算平均值。
添加新课程时,我们遍历 `student_grades` 字典的键(学生姓名),然后直接通过 `student_grades[name][new_subject] = initial_score` 的方式,为每个学生的内层字典添加新的键值对。
题目二:词频统计器
题面:
给定一段英文文本,请编写一个程序,统计文本中每个单词出现的次数,并打印出所有单词及其出现频率(按字母顺序排序)。忽略大小写和标点符号。
思路分析:
这是一个经典的字典应用场景。
首先,需要对文本进行预处理:转换为小写,移除标点符号,然后分割成单词列表。
然后,创建一个空字典,遍历单词列表。对于每个单词:
如果单词已经在字典中,则其对应的计数值加1。
如果单词不在字典中,则将其添加到字典中,并将其计数值设置为1。
最后,将字典按照键(单词)进行排序,并打印结果。
参考代码:import string
text = "Python is an amazing language. Python programming is fun. Learn Python!"
# 1. 文本预处理:转换为小写,移除标点符号
text_lower = ()
# 使用 和 移除标点
translator = ('', '', )
text_no_punctuation = (translator)
# 分割成单词列表
words = ()
# 2. 统计词频
word_counts = {}
for word in words:
# 使用 .get() 方法简化逻辑
word_counts[word] = (word, 0) + 1
print("词频统计结果:")
# 3. 按单词字母顺序排序并打印
for word, count in sorted(()):
print(f"'{word}': {count} 次")
代码解析:
我们首先定义了一段示例文本。
接着,将文本转换为小写 (`()`),并使用 `` 和 `` 巧妙地移除了所有标点符号,这比手动遍历字符判断要高效。
然后,使用 `split()` 方法将处理后的文本分割成单词列表。
核心部分是词频统计。我们初始化一个空字典 `word_counts`。在遍历 `words` 列表时,使用 `(word, 0)`。如果 `word` 已经存在于字典中,`get` 会返回其当前值;如果不存在,则返回默认值 `0`。无论哪种情况,我们都将其加1,这样就避免了 `if-else` 的判断,代码更简洁高效。
最后,使用 `sorted(())` 对字典的键值对进行排序。`sorted()` 函数默认会根据键(即单词)进行排序,返回一个包含元组的列表,然后我们遍历这个列表打印结果。
题目三:合并用户数据
题面:
你有两个字典,分别存储了用户A和用户B的一些信息。请编写程序将这两个字典合并成一个,如果存在相同的键,以用户B的信息为准。user_a = {"id": 101, "name": "Alice", "email": "alice@", "age": 30}
user_b = {"id": 101, "name": "Bob", "phone": "123-456-7890", "age": 25}
思路分析:
合并字典有多种方式。Python 3.5+ 引入了新的合并操作符 ``,可以非常简洁地完成。如果需要兼容旧版本,可以循环遍历或使用 `update()` 方法。题目要求以用户B的信息为准,这意味着在合并时,用户B的同名键会覆盖用户A的值。
参考代码:user_a = {"id": 101, "name": "Alice", "email": "alice@", "age": 30}
user_b = {"id": 101, "name": "Bob", "phone": "123-456-7890", "age": 25}
# 方法一:使用 操作符 (Python 3.5+) - 推荐
# 后面的字典会覆盖前面的字典中重复的键
merged_user_data_1 = {user_a, user_b}
print("合并后的用户数据 (方法一):", merged_user_data_1)
# 方法二:使用 .copy() 和 .update() 方法
merged_user_data_2 = () # 先复制 user_a,避免修改原字典
(user_b) # 用 user_b 的内容更新,重复键会被覆盖
print("合并后的用户数据 (方法二):", merged_user_data_2)
代码解析:
这里提供了两种常用的合并字典的方法。
第一种方法利用了Python 3.5+ 引入的字典解包操作符 ``。`{user_a, user_b}` 会先将 `user_a` 的所有键值对放入新字典,然后将 `user_b` 的所有键值对放入。由于 `user_b` 在后,如果它有与 `user_a` 相同的键(例如 `id`, `name`, `age`),那么 `user_b` 的值会覆盖 `user_a` 的值,完美符合题目要求。
第二种方法是传统且兼容性更好的方式。首先,我们使用 `()` 创建 `user_a` 的一个副本,这样可以避免直接修改 `user_a`。然后,调用 `(user_b)` 方法。`update()` 方法会将 `user_b` 中的所有键值对添加到 `merged_user_data_2` 中,如果键已存在,则更新其值。这同样实现了用户B信息覆盖用户A信息的要求。
题目四:根据字典值排序(排行榜)
题面:
假设你有一个表示游戏得分的字典,其中键是玩家姓名,值是他们的分数。请你编写一个程序,根据分数从高到低对玩家进行排序,并打印出排行榜。game_scores = {"张三": 1500, "李四": 2200, "王五": 1800, "赵六": 1950, "钱七": 2200}
思路分析:
Python字典本身是无序的(在Python 3.7+中字典保持插入顺序,但这不是指按值排序)。要根据值排序,我们需要:
使用 `items()` 方法获取字典的所有键值对,它们会以元组 `(key, value)` 的形式存在于一个可迭代对象中。
使用 `sorted()` 函数对这些元组进行排序。`sorted()` 函数有一个 `key` 参数,可以指定一个函数来提取用于比较的值。在这里,我们需要根据元组的第二个元素(即分数)进行排序。
由于要从高到低,需要设置 `reverse=True`。
遍历排序后的结果并打印。
参考代码:game_scores = {"张三": 1500, "李四": 2200, "王五": 1800, "赵六": 1950, "钱七": 2200}
# 使用 sorted() 函数和 lambda 表达式按值降序排序
# item[1] 表示元组中的第二个元素(分数)
sorted_scores = sorted((), key=lambda item: item[1], reverse=True)
print("游戏排行榜:")
for rank, (player, score) in enumerate(sorted_scores, 1):
print(f"第 {rank} 名: {player} - {score} 分")
# 如果分数相同,希望再按姓名排序(可选)
print("如果分数相同,按姓名排序:")
# 先按分数降序,再按姓名升序
sorted_scores_secondary = sorted((), key=lambda item: (-item[1], item[0]))
for rank, (player, score) in enumerate(sorted_scores_secondary, 1):
print(f"第 {rank} 名: {player} - {score} 分")
代码解析:
核心在于 `sorted((), key=lambda item: item[1], reverse=True)` 这一行。
`()` 返回一个包含所有 `(玩家姓名, 分数)` 元组的视图。
`key=lambda item: item[1]` 是一个匿名函数,它告诉 `sorted()` 函数在比较两个元组时,应该使用元组的第二个元素(即分数)作为排序依据。
`reverse=True` 表示降序排序,也就是分数从高到低。
`enumerate(sorted_scores, 1)` 用于在遍历时同时获取元素的索引和值,`1` 表示从1开始计数,作为排行榜的排名。
对于可选的二级排序,`key=lambda item: (-item[1], item[0])` 是一个技巧。将分数取负号,这样在元组比较时,分值高的负数会更小,从而实现降序。而 `item[0]` 则是玩家姓名,当分数相同时,会按姓名进行升序排序。
题目五:筛选和转换商品库存
题面:
你有一个表示商品库存的字典,键是商品ID,值是包含商品名称和库存数量的列表。
请编写程序:
筛选出库存数量低于或等于10的商品。
将筛选出的商品整理成一个新的字典,键是商品名称,值是其库存数量。
inventory = {
"P001": ["鼠标", 15],
"P002": ["键盘", 8],
"P003": ["显示器", 20],
"P004": ["耳机", 5],
"P005": ["摄像头", 12]
}
思路分析:
这个题目考察字典的遍历、条件判断以及字典的构建。
遍历原始 `inventory` 字典。
在遍历过程中,对每个商品,检查其库存数量(即值列表的第二个元素 `item[1]`)。
如果库存数量满足条件,则将其商品名称(值列表的第一个元素 `item[0]`)和库存数量添加到新的字典中。
参考代码:inventory = {
"P001": ["鼠标", 15],
"P002": ["键盘", 8],
"P003": ["显示器", 20],
"P004": ["耳机", 5],
"P005": ["摄像头", 12]
}
low_stock_products = {}
for product_id, details in ():
product_name = details[0]
stock_quantity = details[1]
if stock_quantity
2025-10-20

当Python遇上大碴子味儿:零基础学编程,东北老铁带你玩转代码世界!
https://jb123.cn/python/70188.html

Python编程环境极速搭建:新手友好的安装指南!
https://jb123.cn/python/70187.html

Perl DBI:轻松驾驭数据库的万能钥匙——从入门到实战精通
https://jb123.cn/perl/70186.html

Perl模拟`cat`命令:文件处理的瑞士军刀与脚本实践
https://jb123.cn/perl/70185.html

Perl更新完全指南:系统内置、多版本管理与从零构建,告别旧版本烦恼!
https://jb123.cn/perl/70184.html
热门文章

Python 编程解密:从谜团到清晰
https://jb123.cn/python/24279.html

Python编程深圳:初学者入门指南
https://jb123.cn/python/24225.html

Python 编程终端:让开发者畅所欲为的指令中心
https://jb123.cn/python/22225.html

Python 编程专业指南:踏上编程之路的全面指南
https://jb123.cn/python/20671.html

Python 面向对象编程学习宝典,PDF 免费下载
https://jb123.cn/python/3929.html