目录
三、字典推导式(Dictionary Comprehension)
一、字典(Dictionary)基础操作
(1)定义和创建
字典是一种可变容器模型,以 {}
定义,存储键值对(key-value
)。键必须是唯一的且不可变类型(如字符串、数字、元组等),值可以是任意数据类型。
# 创建字典
person = {
"name": "张三",
"age": 25,
"hobbies": ["读书", "运动"],
"is_student": False
}
(2)访问元素
通过键来访问对应的值,使用方括号 []
或 get()
方法。
# 使用方括号访问
print(person["name"]) # 输出:张三
# 使用 get() 方法访问(推荐,可以避免 KeyError)
print(person.get("age")) # 输出:25
print(person.get("gender", "男")) # 如果键不存在,返回默认值
(3)添加和修改元素
直接通过键赋值来添加或修改元素。
# 添加新键值对
person["gender"] = "男"
# 修改已有键对应的值
person["age"] = 26
(4)删除元素
可以使用 del
语句、pop()
方法或 popitem()
方法。
# 使用 del 删除
del person["hobbies"]
# 使用 pop() 删除并返回值
age = person.pop("age")
# 使用 popitem() 删除并返回最后一个键值对(Python 3.7+ 按插入顺序)
last_item = person.popitem()
(5)清空字典
使用 clear()
方法。
person.clear() # 清空字典
二、常用操作和方法
(1)遍历字典
✔️ 遍历键(keys()
)
for key in person.keys():
print(key)
✔️ 遍历值(values()
)
for value in person.values():
print(value)
✔️ 遍历键值对(items()
)
for key, value in person.items():
print(f"{key}: {value}")
(2)检查键是否存在
使用 in
关键字。
if "name" in person:
print("存在 name 键")
(3)获取字典的长度
print(len(person)) # 输出键值对的数量
(4)复制字典
使用 copy()
方法。
person_copy = person.copy()
三、字典推导式(Dictionary Comprehension)
用于快速创建字典。
# 示例:创建一个平方数的字典
squares = {x: x**2 for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
四、字典的高级操作
(1)合并字典
在 Python 3.9+ 中,可以使用 |
和 |=
操作符。
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
# 合并两个字典
merged_dict = dict1 | dict2 # {'a':1, 'b':2, 'c':3, 'd':4}
# 更新字典
dict1 |= dict2 # dict1 变为 {'a':1, 'b':2, 'c':3, 'd':4}
对于旧版本 Python,可以使用 update()
方法:
dict1.update(dict2) # 将 dict2 的键值对更新到 dict1
(2)字典排序
可以使用 sorted()
函数。
# 按键排序
sorted_dict = dict(sorted(person.items(), key=lambda item: item[0]))
# 按值排序
sorted_by_value = dict(sorted(person.items(), key=lambda item: item[1]))
(3)嵌套字典
字典的值可以是另一个字典。
nested_dict = {
"class1": {"student1": 90, "student2": 85},
"class2": {"student3": 95, "student4": 88}
}
五、带默认值的字典
使用 collections.defaultdict
。
from collections import defaultdict
# 创建一个默认值为 list 的字典
students = defaultdict(list)
students["class1"].extend(["张三", "李四"])
students["class2"].append("王五")
print(students) # defaultdict(<class 'list'>, {'class1': ['张三', '李四'], 'class2': ['王五']})
六、经典案例(学生管理系统)
可以帮助你熟练掌握for、if、else、while、break、continue的 使用和嵌套熟悉list 和 dict的使用
student_info =[ {
"id" : 101,
"name" : "张三",
"age" : 18,
"sex" : "男"
},{
"id" : 102,
"name" : "翠花",
"age" : 16,
"sex" : "女"
}]
while True:
print("***************相关操作************************")
print("输入数字1,添加学生信息")
print("输入数字2,查看所有学生信息")
print("输入数字3,查看指定学生信息")
print("输入数字4,修改学生信息")
print("输入数字5,删除指定学生")
print("输入数字0,退出系统")
number = int(input("输入操作数字"))
if 0 <= number <= 5:
if number == 1:
student = {}
student_id = 100
for e in student_info:
if student_id < e["id"]:
student_id = e["id"]
student["id"] = student_id + 1
while True:
name = input("输入姓名")
if len(name) < 2 or len(name) > 4:
print("名字不合法")
print("请重新输入")
continue
else:
student["name"] = name
break
while True:
age = int(input("输入年龄"))
if age > 25 or age < 16:
print("年龄不符合(16-25)")
print("请重新输入")
continue
else:
student["age"] = age
break
while True:
sex = input("输入性别")
if sex == "男" or sex == "女":
student["sex"] = sex
break
else:
print("性别不正确(男/女)")
print("请重新输入")
continue
student_info.append(student)
print("添加成功")
print(student)
continue
if number == 2:
for e in student_info:
print(e)
continue
if number == 3:
ip_id = int(input("请输入要查看的id"))
for student in student_info:
if student["id"] == ip_id:
print(student)
break
else:
print("该学生不存在")
continue
if number == 4:
ip_id = int(input("请输入要修改的id"))
for student in student_info:
if student["id"] == ip_id:
while True:
name = input("输入姓名")
if len(name) < 2 or len(name) > 4:
print("名字不合法")
print("请重新输入")
continue
else:
student["name"] = name
break
while True:
age = int(input("输入年龄"))
if age > 25 or age < 16:
print("年龄不符合(16-25)")
print("请重新输入")
continue
else:
student["age"] = age
break
while True:
sex = input("输入性别")
if sex == "男" or sex == "女":
student["sex"] = sex
break
else:
print("性别不正确(男/女)")
print("请重新输入")
continue
print("修改成功")
print(student)
break
else:
print("该学生不存在")
break
if number == 5:
ip_id = int(input("请输入要删除的id"))
for student in student_info:
if student["id"] == ip_id:
student_info.remove(student)
print("删除成功")
break
else:
print("该学生不存在")
continue
if number == 0:
print("已退出系统")
break
else:
print("无效的操作,请重新输入")
-
使用
for
循环查找学生,而不是依赖索引计算。 -
添加了输入验证和操作范围检查。
-
对添加学生时的
id
生成逻辑进行了优化。
不过,仍有一些可以进一步优化的地方,我会逐一指出,并给出改进建议。
✅ 功能分析
1. 添加学生信息(number == 1
)
student_id = 100
for e in student_info:
if student_id < e["id"]:
student_id = e["id"]
student["id"] = student_id + 1
✅ 优点:
-
通过遍历找到最大
id
,避免重复。
2. 修改学生信息(number == 4
)
for student in student_info:
if student["id"] == ip_id:
# 修改逻辑
...
break
else:
print("该学生不存在")
break
3. 删除学生信息(number == 5
)
for student in student_info:
if student["id"] == ip_id:
student_info.remove(student)
print("删除成功")
break
else:
print("该学生不存在")
✅ 优点:
-
使用
for...else
结构,逻辑清晰。
4. 输入验证
你已经对 number
进行了范围验证:
if 0 <= number <= 5:
这是一个很好的实践,避免了无效操作。
总结
(1)字典适合的场景
-
需要快速通过键查找值
-
存储无序的键值对集合
-
需要动态添加或删除数据
(2)优点
-
高效的查找和更新操作(平均时间复杂度 O(1))
-
灵活的键值对结构
(3)缺点
-
键必须是可哈希(不可变)类型
-
占用内存相对较大