当前位置:首页>python>Day6:Python字典,你的万能查找表!一秒找到任何信息

Day6:Python字典,你的万能查找表!一秒找到任何信息

  • 2026-09-29 07:46:04
Day6:Python字典,你的万能查找表!一秒找到任何信息

还在Excel里按Ctrl+F?字典让你用Python秒查学生档案、统计投票、管理数据!

一、字典:键值对的超强组合

字典就像通讯录:名字(键)→ 电话(值)

1.1 创建字典

# 创建一个学生字典学生信息 = {"张三": {"年龄": 12, "班级": "三年级二班", "电话": "13800138000"},"李四": {"年龄": 11, "班级": "三年级一班", "电话": "13800138001"},"王五": {"年龄": 12, "班级": "三年级二班", "电话": "13800138002"}}# 创建课程字典课程安排 = {"周一": ["语文", "数学", "英语"],"周二": ["数学", "体育", "音乐"],"周三": ["英语", "科学", "美术"],"周四": ["语文", "数学", "班会"],"周五": ["体育", "音乐", "社会实践"]}print("学生字典:", 学生信息)print("\n课程安排:", 课程安排)

代码解释:

  • {}:大括号创建字典

  • "张三": {...}:冒号分隔键和值

  • 键必须是不可变类型(字符串、数字、元组)

  • 值可以是任何类型(列表、字典、字符串等)

1.2 访问字典数据

# 获取单个学生的信息学生 = 学生信息["张三"]print("张三的信息:", 学生)print("张三的班级:", 学生["班级"])print("张三的电话:", 学生信息["张三"]["电话"])  # 直接链式访问# 更安全的方式:用get()避免键不存在时报错电话 = 学生信息.get("赵六", "未登记")  # 第二个参数是默认值print("赵六的电话:", 电话)# 获取所有键和值print("\n所有学生姓名:", list(学生信息.keys()))print("所有学生信息:", list(学生信息.values()))# 遍历字典print("\n=== 所有学生信息 ===")for 姓名, 信息 in 学生信息.items():print(f"{姓名}:{信息['年龄']}岁,班级:{信息['班级']}")

代码解释:

  • 字典[键]:访问字典值,键不存在会报错

  • .get(键, 默认值):安全访问,键不存在返回默认值

  • .keys():获取所有键

  • .values():获取所有值

  • .items():获取所有键值对,用于遍历

二、字典的增删改查

# 创建一个考试成绩字典考试成绩 = {"张三": {"语文": 85, "数学": 92, "英语": 88},"李四": {"语文": 78, "数学": 85, "英语": 80}}print("原始成绩:", 考试成绩)# 1. 增:添加新学生考试成绩["王五"] = {"语文": 92, "数学": 95, "英语": 90}print("\n添加王五后:", 考试成绩)# 2. 改:修改分数考试成绩["张三"]["数学"] = 96  # 修改单科考试成绩["李四"] = {"语文": 82, "数学": 88, "英语": 85}  # 替换整个记录print("修改后:", 考试成绩)# 3. 删:删除学生del 考试成绩["王五"]print("\n删除王五后:", 考试成绩)# 更安全的删除方式移除的分数 = 考试成绩.pop("李四", None)  # pop返回被删除的值print(f"移除的李四成绩:{移除的分数}")# 4. 查:检查是否存在if"张三"in 考试成绩:print("\n张三的成绩还在")if"赵六" not in 考试成绩:print("赵六没有成绩记录")

代码解释:

  • 字典[新键] = 值:添加新条目

  • 字典[键][子键] = 新值:修改嵌套字典

  • del 字典[键]:删除条目

  • .pop(键, 默认值):删除并返回值

  • in 和 not in:检查键是否存在

三、教师办公实战

3.1 学生档案管理系统

class 学生档案管理系统:    def __init__(self):# 初始化一个空字典存储学生信息        self.学生档案 = {}    def 添加学生(self, 学号, 姓名, 年龄, 班级):"""添加新学生"""if 学号 in self.学生档案:print(f"⚠️ 学号 {学号} 已存在!")return False        self.学生档案[学号] = {"姓名": 姓名,"年龄": 年龄,"班级": 班级,"成绩": {},  # 初始化空成绩字典"考勤": []   # 初始化空考勤列表        }print(f"✅ 已添加学生:{姓名}(学号:{学号})")return True    def 登记成绩(self, 学号, 科目, 分数):"""登记学生成绩"""if 学号 not in self.学生档案:print(f"❌ 找不到学号 {学号}")return False        self.学生档案[学号]["成绩"][科目] = 分数print(f"✅ 已登记 {self.学生档案[学号]['姓名']} 的 {科目} 成绩:{分数}分")return True    def 记录考勤(self, 学号, 日期, 状态="正常"):"""记录学生考勤"""if 学号 not in self.学生档案:print(f"❌ 找不到学号 {学号}")return False        self.学生档案[学号]["考勤"].append({"日期": 日期,"状态": 状态  # 正常、迟到、请假、旷课        })print(f"✅ 已记录 {self.学生档案[学号]['姓名']} 的考勤:{日期} - {状态}")return True    def 查询学生(self, 学号):"""查询学生详细信息"""        学生 = self.学生档案.get(学号)if not 学生:print(f"❌ 找不到学号 {学号}")return Noneprint(f"\n📋 学生档案 - 学号:{学号}")print(f"姓名:{学生['姓名']}")print(f"年龄:{学生['年龄']}岁")print(f"班级:{学生['班级']}")if 学生["成绩"]:print("\n📊 成绩记录:")for 科目, 分数 in 学生["成绩"].items():print(f"  {科目}:{分数}分")if 学生["考勤"]:print("\n📅 最近考勤(最近5条):")for 记录 in 学生["考勤"][-5:]:print(f"  {记录['日期']}:{记录['状态']}")return 学生    def 统计班级成绩(self, 班级):"""统计班级各科平均分"""print(f"\n📈 班级成绩统计 - {班级}")        班级成绩 = {}        学生数量 = 0for 学号, 学生 in self.学生档案.items():if 学生["班级"] == 班级:                学生数量 += 1for 科目, 分数 in 学生["成绩"].items():if 科目 not in 班级成绩:                        班级成绩[科目] = []                    班级成绩[科目].append(分数)if 学生数量 == 0:print("❌ 该班级没有学生或未登记成绩")returnprint(f"学生人数:{学生数量}")print("各科平均分:")for 科目, 分数列表 in 班级成绩.items():            平均分 = sum(分数列表) / len(分数列表)print(f"  {科目}:{平均分:.1f}分")# 使用示例if __name__ == "__main__":    系统 = 学生档案管理系统()# 添加学生    系统.添加学生("2023001", "张三", 12, "三年级二班")    系统.添加学生("2023002", "李四", 11, "三年级二班")    系统.添加学生("2023003", "王五", 12, "三年级一班")# 登记成绩    系统.登记成绩("2023001", "语文", 85)    系统.登记成绩("2023001", "数学", 92)    系统.登记成绩("2023002", "语文", 78)    系统.登记成绩("2023002", "数学", 85)    系统.登记成绩("2023003", "语文", 92)# 记录考勤    系统.记录考勤("2023001", "2023-10-16", "正常")    系统.记录考勤("2023002", "2023-10-16", "迟到")    系统.记录考勤("2023001", "2023-10-17", "正常")# 查询学生    系统.查询学生("2023001")# 统计班级成绩    系统.统计班级成绩("三年级二班")

代码解释:

  • class 学生档案管理系统::创建类,封装相关功能

  • __init__:初始化方法,创建实例时自动调用

  • self.学生档案:实例变量,每个实例独立

  • 方法都以self为第一个参数,访问实例变量

  • .get():安全访问字典值

3.2 投票统计系统

def 统计投票(投票数据):"""统计投票结果"""    统计结果 = {}    总票数 = len(投票数据)# 统计每个选项的票数for 投票 in 投票数据:        选项 = 投票["选项"]        统计结果[选项] = 统计结果.get(选项, 0) + 1# 计算百分比    结果带百分比 = {}for 选项, 票数 in 统计结果.items():        百分比 = (票数 / 总票数) * 100        结果带百分比[选项] = {"票数": 票数,"百分比": round(百分比, 1)        }# 按票数排序    排序结果 = dict(sorted(        结果带百分比.items(),        key=lambda x: x[1]["票数"],        reverse=True    ))return 排序结果, 总票数def 生成投票报告(投票主题, 投票数据):"""生成投票结果报告"""print(f"\n🗳️ 投票结果报告 - {投票主题}")print("=" * 50)    统计结果, 总票数 = 统计投票(投票数据)print(f"总票数:{总票数}")print("\n投票结果:")for 排名, (选项, 数据) in enumerate(统计结果.items(), 1):print(f"{排名}. {选项}")print(f"   票数:{数据['票数']}票,占比:{数据['百分比']}%")# 找出最高票    最高票选项 = max(统计结果.items(), key=lambda x: x[1]["票数"])print(f"\n🏆 最高票:{最高票选项[0]},得票率:{最高票选项[1]['百分比']}%")return 统计结果# 使用示例:选举班干部投票主题 = "2023年班级班长选举"投票数据 = [    {"投票人": "张三", "选项": "李四"},    {"投票人": "李四", "选项": "王五"},    {"投票人": "王五", "选项": "王五"},    {"投票人": "赵六", "选项": "李四"},    {"投票人": "钱七", "选项": "李四"},    {"投票人": "孙八", "选项": "王五"},    {"投票人": "周九", "选项": "张三"},    {"投票人": "吴十", "选项": "李四"},]结果 = 生成投票报告(投票主题, 投票数据)# 保存结果到文件import jsonwith open("投票结果.json", "w", encoding="utf-8") as f:    json.dump({"主题": 投票主题,"总票数": len(投票数据),"结果": 结果    }, f, ensure_ascii=False, indent=2)print("\n✅ 投票结果已保存到:投票结果.json")

代码解释:

  • .get(选项, 0):获取票数,不存在则返回0

  • sorted(..., key=lambda x: x[1]["票数"], reverse=True):按票数降序排序

  • lambda x: x[1]["票数"]:匿名函数,获取票数作为排序依据

  • json.dump():将字典保存为JSON文件

  • ensure_ascii=False:确保中文字符正确保存

  • indent=2:缩进2格,美化输出

3.3 文件目录统计器

import osfrom collections import defaultdictdef 统计文件目录(目录路径):"""统计目录下的文件类型和大小"""if not os.path.exists(目录路径):print(f"❌ 目录不存在:{目录路径}")return    文件统计 = defaultdict(lambda: {"数量": 0, "总大小": 0})    总文件数 = 0    总大小 = 0print(f"📁 正在统计目录:{目录路径}")print("=" * 50)# 遍历目录for 根目录, 目录列表, 文件列表 in os.walk(目录路径):for 文件名 in 文件列表:            文件路径 = os.path.join(根目录, 文件名)# 获取文件扩展名            扩展名 = os.path.splitext(文件名)[1].lower()if not 扩展名:                扩展名 = "无扩展名"# 获取文件大小            文件大小 = os.path.getsize(文件路径)# 更新统计            文件统计[扩展名]["数量"] += 1            文件统计[扩展名]["总大小"] += 文件大小            总文件数 += 1            总大小 += 文件大小# 显示结果print(f"📊 统计结果:")print(f"总文件数:{总文件数}个")print(f"总大小:{总大小/1024/1024:.2f} MB\n")print("按文件类型统计:")print("-" * 40)print("扩展名 | 数量 | 大小(MB) | 占比")print("-" * 40)for 扩展名, 统计 in sorted(文件统计.items(), key=lambda x: x[1]["数量"], reverse=True):        数量 = 统计["数量"]        大小MB = 统计["总大小"] / 1024 / 1024        占比 = (数量 / 总文件数 * 100) if 总文件数 > 0 else 0print(f"{扩展名:8} | {数量:4} | {大小MB:8.2f} | {占比:5.1f}%")return 文件统计, 总文件数, 总大小# 使用示例if __name__ == "__main__":# 可以替换为实际的目录路径    测试目录 = "."    统计文件目录(测试目录)# 保存统计结果    结果, 文件数, 总大小 = 统计文件目录(测试目录)    统计报告 = {"目录": 测试目录,"总文件数": 文件数,"总大小_MB": 总大小 / 1024 / 1024,"文件类型统计": 结果    }    with open("目录统计报告.json", "w", encoding="utf-8") as f:        import json        json.dump(统计报告, f, ensure_ascii=False, indent=2)print("\n✅ 统计报告已保存到:目录统计报告.json")

代码解释:

  • from collections import defaultdict:导入默认字典,自动创建不存在的键

  • os.walk():递归遍历目录

  • os.path.splitext():分割文件名和扩展名

  • os.path.getsize():获取文件大小(字节)

  • defaultdict(lambda: {"数量": 0, "总大小": 0}):创建默认值为字典的默认字典

  • /1024/1024:将字节转换为MB

四、今日核心要点

  1. 创建字典:{键1: 值1, 键2: 值2}
  2. 访问字典:字典[键] 或 字典.get(键, 默认值)
  3. 修改字典:字典[键] = 新值
  4. 遍历字典:for 键, 值 in 字典.items():
  5. 嵌套字典:字典的值可以是另一个字典
  6. 字典方法:.keys()、.values()、.items()、.pop()

五、明日预告

明天我们将学习 第一阶段复盘:写个"办公室今日运势"生成器!

综合运用前6天学的所有知识:

  • 变量和字符串

  • 条件判断

  • 循环

  • 列表

  • 函数

  • 字典

打造一个真正的办公小工具!

用代码把重复劳动变没,把摸鱼时间变多!

下期:明天下午6点,继续我们的Python摸鱼之旅!星标🌟我们,不错过每期干货!

P.P.S 想要今天所有代码的完整文件?

回复"Py-Day6"获取完整代码文件!

最新文章

随机文章