还在Excel里按Ctrl+F?字典让你用Python秒查学生档案、统计投票、管理数据!
# 创建一个学生字典学生信息 = {"张三": {"年龄": 12, "班级": "三年级二班", "电话": "13800138000"},"李四": {"年龄": 11, "班级": "三年级一班", "电话": "13800138001"},"王五": {"年龄": 12, "班级": "三年级二班", "电话": "13800138002"}}# 创建课程字典课程安排 = {"周一": ["语文", "数学", "英语"],"周二": ["数学", "体育", "音乐"],"周三": ["英语", "科学", "美术"],"周四": ["语文", "数学", "班会"],"周五": ["体育", "音乐", "社会实践"]}print("学生字典:", 学生信息)print("\n课程安排:", 课程安排)
{}:大括号创建字典
"张三": {...}:冒号分隔键和值
键必须是不可变类型(字符串、数字、元组)
值可以是任何类型(列表、字典、字符串等)
# 获取单个学生的信息学生 = 学生信息["张三"]print("张三的信息:", 学生)print("张三的班级:", 学生["班级"])print("张三的电话:", 学生信息["张三"]["电话"]) # 直接链式访问# 更安全的方式:用get()避免键不存在时报错电话 = 学生信息.get("赵六", "未登记") # 第二个参数是默认值print("赵六的电话:", 电话)# 获取所有键和值print("\n所有学生姓名:", list(学生信息.keys()))print("所有学生信息:", list(学生信息.values()))# 遍历字典print("\n=== 所有学生信息 ===")for 姓名, 信息 in 学生信息.items():print(f"{姓名}:{信息['年龄']}岁,班级:{信息['班级']}")
# 创建一个考试成绩字典考试成绩 = {"张三": {"语文": 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:检查键是否存在
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")# 统计班级成绩 系统.统计班级成绩("三年级二班")
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格,美化输出
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
- 访问字典:字典[键] 或 字典.get(键, 默认值)
- 遍历字典:for 键, 值 in 字典.items():
- 字典方法:.keys()、.values()、.items()、.pop()
明天我们将学习 第一阶段复盘:写个"办公室今日运势"生成器!
综合运用前6天学的所有知识:
打造一个真正的办公小工具!
下期:明天下午6点,继续我们的Python摸鱼之旅!星标🌟我们,不错过每期干货!
P.P.S 想要今天所有代码的完整文件?
回复"Py-Day6"获取完整代码文件!