不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。
python系列之字典
python系列前期章节
一、字典是什么?为什么需要它?
1、概述
生活场景:想象一本真实的字典——通过“字”快速查找到对应的“解释”。在Python中,字典(dict
)就是这样的键值对集合,用{ }
包裹,能通过键(Key)快速找到对应的值(Value);键是唯一的。
2、对比其他数据结构
- 列表:按顺序存储,查找元素需要遍历
- 字典:无需顺序,通过唯一键快速定位(速度提升100倍以上!)
二、字典的创建与基础操作
1. 创建字典的3种方式
# 方式1:直接赋值
student = {"name": "小明", "age": 18, "score": 95}
# 方式2:dict()构造函数
teacher = dict(name="王老师", subject="数学", years=5)
# 方式3:从键值对列表转换(适合动态生成)
items = [("city", "北京"), ("area", 16410)]
city_info = dict(items)
2. 键的唯一性
字典中的键是唯一的,就像现实生活中的身份证。如果键名重复了,那么就会被覆盖掉。
dict8 = {'name': 'jack', 'age': 12, 'age': 15}
print(dict8)
运行如下:
3. 核心操作四件套
操作 | 代码示例 | 说明 |
---|---|---|
通过键获取值 | student["name"] | 返回"小明",键不存在则报错 |
安全获取值 | student.get("height", 175) | 键不存在返回设置的默认值175 |
添加/修改值 | student["gender"] = "男" | 新增性别字段 |
删除键值 | del student["score"] | 删除成绩字段 |
实操代码:
dict2 = {'name': 'zhangsan', 'age': 32}
# 新增、修改和删除
dict2['sex'] = '男'
dict2['age'] = 26 # 直接覆盖
# 删除
# del dict2['name']
dict2.pop("name")
# dict2.clear()
print(dict2)
# 查询
if 'sex' in dict2:
print(dict2['sex'])
dict2.get('name','未定义')
# 字典中的一些函数
# 创建一个新字典,可以指定键创建,且每一个键的值是None。
new_dict = dict2.fromkeys(['aa','sex'])
print(new_dict)
# 遍历
# items把所有的项都放在一个列表中
for k,v in dict2.items():
print(f'key={k},value={v}')
运行结果:
三、实际场景中的高频应用
场景1:用户信息管理系统
# 用户注册功能
user_db = {}
def register(username, password):
if username in user_db: # 快速检查用户名是否存在
print("用户名已存在!")
else:
user_db[username] = {
"password": password,
"login_count": 0,
"last_login": None
}
print("注册成功!")
register("Alice", "123456")
print(user_db)
# 输出:{'Alice': {'password': '123456', 'login_count': 0, 'last_login': None}}
运行结果:
场景2:电商商品数据统计
# 统计商品销量
sales_data = {
"iPhone15": {"price": 6999, "sales": 120},
"小米14": {"price": 3999, "sales": 300},
"华为Mate60": {"price": 5999, "sales": 250}
}
# 计算总销售额
total = sum(item["price"] * item["sales"] for item in sales_data.values())
print(f"总销售额:{total}元")
# 更新华为销量
sales_data["华为Mate60"]["sales"] += 50
print("目前销量数据:",sales_data)
运行结果:
四、必须掌握的8个进阶技巧
1. 遍历字典的三种姿势
# 定义一个字典
student = {"name": "小明", "age": 18, "gender": '男'}
# 遍历键
for key in student.keys():
print(key) # 输出:name, age, gender...
# 遍历值
for value in student.values():
print(value) # 输出:小明, 18, 男...
# 遍历键值对(最常用!)
for key, value in student.items():
print(f"{key}: {value}")
2. 字典推导式(一行代码生成字典)
# 生成字母ASCII码字典
ascii_dict = {char: ord(char) for char in "ABCDEF"}
print(ascii_dict) # {'A': 65, 'B': 66, ..., 'F': 70}
【说明】ord() 函数,用于返回单个字符的ASCII数值或Unicode数值。这个函数接受一个长度为1的字符串作为参数,如果传入的字符超出了Python定义范围,则会引发TypeError异常
3. 合并两个字典
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
merged = {**dict1, **dict2} # 新语法,后者覆盖前者
print(merged) # {'a': 1, 'b': 3, 'c': 4}
4. 设置默认值(setdefault
妙用)
setdefault是字典类型的一个方法,它的作用是如果这个键在字典中不存在的话,在字典中添加一个键值对。如果键已经存在,那么setdefault方法不会改变这个键的值,而是返回这个键当前对应的值。
# 统计单词出现次数
text = "apple banana apple orange banana"
word_counts = {}
for word in text.split():
word_counts.setdefault(word, 0)
word_counts[word] += 1
print(word_counts) # {'apple': 2, 'banana': 2, 'orange': 1}
五、避坑指南(常见错误)
-
键必须是不可变类型
✅ 允许:字符串、数字、元组
❌ 禁止:列表、字典等可变类型作为键 -
避免直接修改遍历中的字典
# 错误示范 d = {"a":1, "b":2} for k in d: del d[k] # 引发RuntimeError # 正确做法 for k in list(d.keys()): # 先转换为列表 del d[k]
六、综合实战:开发简易学生管理系统
students = {}
def add_student():
sid = input("输入学号:")
info = {
"name": input("姓名:"),
"age": int(input("年龄:")),
"major": input("专业:")
}
students[sid] = info
print(f"学生{sid}添加成功!")
def query_student():
sid = input("输入查询学号:")
student = students.get(sid)
if student:
print(f"姓名:{student['name']} 年龄:{student['age']} 专业:{student['major']}")
else:
print("查无此人!")
# 使用示例
add_student()
query_student()
运行演示:
七、总结与提升
字典优势总结:
- 闪电般的查找速度(O(1)时间复杂度)
- 灵活的数据结构(支持嵌套、动态增删)
- 天然适合处理JSON数据(与Web开发完美契合)
提升练习:
尝试用字典实现一个通讯录程序