🐍 Python Day10:字典 — 键值对的魔法世界
🕐 预计用时:2-3 小时 | 🎯 今日目标:掌握字典的创建、访问、修改和常用操作
📖 今日目录
1. 什么是字典?
字典(Dict)是 Python 最强大的数据结构——用"键-值对"存储数据,就像一本真正的字典。
查"苹果" → 得到"apple",查"香蕉" → 得到"banana"。
# 列表:按位置取值scores = [95, 87, 92]print(scores[0]) # 95(第几个?不直观)# 字典:按名字取值scores = {"张三": 95, "李四": 87, "王五": 92}print(scores["张三"]) # 95(一目了然)
2. 创建字典
📖 直接创建
# 空字典empty = {}empty2 = dict()# 带数据的字典person = { "name": "张三", "age": 25, "height": 175.5, "is_student": False}print(person) # {'name': '张三', 'age': 25, ...}print(len(person)) # 4 — 键值对数量
🏭 其他创建方式
# 从键值对列表创建pairs = [("name", "张三"), ("age", 25)]d = dict(pairs)print(d) # {'name': '张三', 'age': 25}# 用关键字参数d = dict(name="张三", age=25)print(d) # {'name': '张三', 'age': 25}# 用 fromkeys 批量创建(所有键共享同一个值)keys = ["a", "b", "c"]d = dict.fromkeys(keys, 0)print(d) # {'a': 0, 'b': 0, 'c': 0}
💡 字典的键必须是不可变类型: ✅ 可以用:字符串、数字、元组 ❌ 不能用:列表、字典、集合(因为可变)
# ✅ 合法d = {"name": "张三", 42: "数字键", (1,2): "元组键"}# ❌ 不合法# d = {[1,2]: "列表键"} # TypeError!
3. 访问字典
📍 用键取值
person = {"name": "张三", "age": 25, "city": "北京"}print(person["name"]) # 张三print(person["age"]) # 25# 键不存在会报错 KeyError# print(person["email"]) # ❌ KeyError
🛡️ 用 get() 安全取值
# get() 键不存在时返回默认值,不报错print(person.get("name")) # 张三print(person.get("email")) # None(不报错)print(person.get("email", "无")) # 无(自定义默认值)
💡 person["key"] vs person.get("key"):["key"] = 确定键存在时用,不存在会报错 .get("key") = 不确定键是否存在时用,更安全 实际开发中,get() 用得更多。
🔍 判断键是否存在
person = {"name": "张三", "age": 25}# in 判断print("name" in person) # Trueprint("email" in person) # False# 也支持 not inprint("email" not in person) # True
4. 增删改操作
➕ 添加/修改
person = {"name": "张三", "age": 25}# 修改已有的值person["age"] = 26print(person) # {'name': '张三', 'age': 26}# 添加新键值对person["email"] = "zhangsan@example.com"person["city"] = "上海"print(person) # {'name': '张三', 'age': 26, 'email': '...', 'city': '上海'}# update() 批量更新(合并字典)person.update({"age": 27, "phone": "13800138000"})print(person) # age 更新为 27,新增 phone
➖ 删除
person = {"name": "张三", "age": 25, "city": "北京", "email": "test@test.com"}# del — 按键删除del person["city"]print(person) # {'name': '张三', 'age': 25, 'email': '...'}# pop() — 删除并返回值age = person.pop("age")print(age) # 25print(person) # {'name': '张三', 'email': '...'}# pop() 带默认值 — 键不存在也不报错phone = person.pop("phone", "未填写")print(phone) # 未填写# popitem() — 删除最后一个键值对last = person.popitem()print(last) # ('email', 'test@test.com')# clear() — 清空person.clear()print(person) # {}
5. 字典常用方法
📋 获取所有键、值、键值对
person = {"name": "张三", "age": 25, "city": "北京"}# 所有键print(person.keys()) # dict_keys(['name', 'age', 'city'])# 所有值print(person.values()) # dict_values(['张三', 25, '北京'])# 所有键值对print(person.items()) # dict_items([('name', '张三'), ('age', 25), ('city', '北京')])# 转成列表print(list(person.keys())) # ['name', 'age', 'city']print(list(person.values())) # ['张三', 25, '北京']
🔄 遍历字典
person = {"name": "张三", "age": 25, "city": "北京"}# 遍历键for key in person: print(key, ":", person[key])# 遍历键值对(推荐)for key, value in person.items(): print(f"{key} = {value}")# 遍历值for value in person.values(): print(value)
📊 方法速查表
| | |
|---|
get(key, default) | | d.get("name", "无") |
keys() | | d.keys() |
values() | | d.values() |
items() | | d.items() |
update(dict2) | | d.update({"a": 1}) |
pop(key) | | d.pop("name") |
popitem() | | d.popitem() |
setdefault(key, val) | | d.setdefault("x", 0) |
clear() | | d.clear() |
copy() | | d.copy() |
💡 setdefault 的妙用——计数器:
# 统计字符出现次数text = "hello world"counter = {}for ch in text: counter[ch] = counter.get(ch, 0) + 1print(counter) # {'h': 1, 'e': 1, 'l': 3, 'o': 2, ...}
6. 字典推导式
# 基本语法squares = {i: i**2 for i in range(1, 6)}print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}# 带条件even_sq = {i: i**2 for i in range(1, 11) if i % 2 == 0}print(even_sq) # {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}# 两个列表合并成字典keys = ["name", "age", "city"]values = ["张三", 25, "北京"]person = {k: v for k, v in zip(keys, values)}print(person) # {'name': '张三', 'age': 25, 'city': '北京'}# 反转字典d = {"a": 1, "b": 2, "c": 3}reversed_d = {v: k for k, v in d.items()}print(reversed_d) # {1: 'a', 2: 'b', 3: 'c'}
7. 嵌套字典
字典的值可以是任何类型——包括另一个字典。
# 学生信息(嵌套字典)students = { "张三": { "age": 20, "scores": {"数学": 95, "英语": 87, "Python": 92} }, "李四": { "age": 21, "scores": {"数学": 78, "英语": 90, "Python": 85} }}# 访问嵌套值print(students["张三"]["scores"]["数学"]) # 95# 遍历嵌套字典for name, info in students.items(): print(f"\n{name}:") print(f" 年龄:{info['age']}") for subject, score in info["scores"].items(): print(f" {subject}:{score}")
8. 实战项目
🏋️ 实战 1:通讯录管理系统
contacts = {}print("=== 通讯录管理系统 ===")while True: print("\n1. 添加联系人") print("2. 查找联系人") print("3. 删除联系人") print("4. 查看所有联系人") print("5. 修改联系人") print("0. 退出") choice = input("请选择:") if choice == "1": name = input("姓名:") phone = input("电话:") email = input("邮箱:") contacts[name] = {"phone": phone, "email": email} print(f"✅ {name} 已添加") elif choice == "2": name = input("查找姓名:") if name in contacts: info = contacts[name] print(f"电话:{info['phone']}") print(f"邮箱:{info['email']}") else: print("❌ 联系人不存在") elif choice == "3": name = input("删除姓名:") if name in contacts: del contacts[name] print(f"✅ {name} 已删除") else: print("❌ 联系人不存在") elif choice == "4": if contacts: print("\n--- 通讯录 ---") for name, info in contacts.items(): print(f"{name}:{info['phone']} / {info['email']}") print(f"共 {len(contacts)} 个联系人") else: print("通讯录为空") elif choice == "5": name = input("修改谁的信息:") if name in contacts: print("1.修改电话 2.修改邮箱") sub = input("选择:") if sub == "1": contacts[name]["phone"] = input("新电话:") print("✅ 电话已更新") elif sub == "2": contacts[name]["email"] = input("新邮箱:") print("✅ 邮箱已更新") else: print("❌ 联系人不存在") elif choice == "0": print("再见!") break else: print("无效选择")
🏋️ 实战 2:单词频率统计
text = input("请输入一段英文文本:").lower()# 去除标点符号for ch in ".,!?;:\"'()[]{}": text = text.replace(ch, "")words = text.split()freq = {}for word in words: freq[word] = freq.get(word, 0) + 1# 按频率排序sorted_freq = sorted(freq.items(), key=lambda x: x[1], reverse=True)print("\n=== 词频统计 ===")for word, count in sorted_freq[:10]: # 显示前10 bar = "█" * count print(f"{word:12s} | {bar} ({count})")
🏋️ 练习题
练习 1:创建一个字典存储5个学生的成绩,计算平均分,找出最高分和最低分的学生。
练习 2:写一个程序,输入一段文本,统计每个字符出现的次数(忽略空格)。
练习 3:给定两个字典 {"a": 1, "b": 2} 和 {"b": 3, "c": 4},合并成一个字典(相同键的值相加)。结果:{"a": 1, "b": 5, "c": 4}。
练习 4:用字典推导式创建一个映射:把 1~10 的数字映射为它的平方根。
9. 今日小结
| |
|---|
| |
| d["key"] |
| d["key"] = val |
| for k, v in d.items() |
| {k: v for k, v in ...} |
| 字典的值可以是字典,用 d["k1"]["k2"] 访问 |
| d[key] = d.get(key, 0) + 1 |
🧠 自检清单
⬜ 能创建字典并用键访问值
⬜ 知道 ["key"] 和 .get("key") 的区别
⬜ 能增删改字典元素
⬜ 能用 items() 遍历字典
⬜ 能用字典推导式创建字典
⬜ 能用 get(key, 0) + 1 做计数器
⭐ 能处理嵌套字典
🎯 Day 11 预告
明天学习函数(Function)——把重复的代码封装成"工具",用的时候调一下就行。
就像你有一把"万能扳手",遇到螺丝就拧一下。🔧
📅 Day 10 完成!列表、元组、集合、字典——Python 四大容器全部学完。明天开始学函数,进入"真正编程"的世界!明天见! 🚀