一、回顾:什么是字典?
字典(dict)是 Python 中存储键值对的容器,键唯一且不可变,值可以是任意类型。字典是可变的,因此我们可以动态地添加、修改、删除其中的键值对,也可以方便地查找和访问。
student = {"name": "小明", "age": 18}
本文将系统介绍字典的增、删、改、查操作,并涵盖相关方法和注意事项。
二、增加和修改字典元素(增 / 改)
2.1 直接赋值 dict[键] = 值
如果键不存在,则为添加新键值对;如果键已存在,则为修改对应值。
student = {"name": "小明", "age": 18}# 修改已有键的值student["age"] = 19print(student) # {'name': '小明', 'age': 19}# 添加新的键值对student["city"] = "北京"print(student) # {'name': '小明', 'age': 19, 'city': '北京'}
2.2 使用 update() 方法合并字典
update([other]) 方法可以将另一个字典或可迭代的键值对添加到当前字典中,如果键重复,则覆盖原值。
student = {"name": "小明", "age": 18}# 用另一个字典更新new_info = {"age": 20, "score": 95}student.update(new_info)print(student) # {'name': '小明', 'age': 20, 'score': 95}# 直接传入键值对元组列表student.update([("gender", "男"), ("city", "上海")])print(student) # {'name': '小明', 'age': 20, 'score': 95, 'gender': '男', 'city': '上海'}# 使用关键字参数(键名必须是合法标识符)student.update(hobby="篮球", height=175)print(student) # ... 'hobby': '篮球', 'height': 175
注意:update() 没有返回值,直接修改原字典。
三、删除字典元素(删)
3.1 del 语句——按键删除
student = {"name": "小明", "age": 18, "city": "北京"}del student["age"]print(student) # {'name': '小明', 'city': '北京'}# 删除不存在的键会引发 KeyError# del student["gender"] # KeyError
del 还可以删除整个字典变量:
del student# print(student) # NameError: name 'student' is not defined
3.2 pop() 方法——删除并返回指定键的值
pop(key[, default]) 删除指定键,并返回其对应的值。如果键不存在,返回 default(若未提供 default 则引发 KeyError)。
student = {"name": "小明", "age": 18, "city": "北京"}age = student.pop("age")print(age) # 18print(student) # {'name': '小明', 'city': '北京'}# 安全删除,提供默认值gender = student.pop("gender", "未知")print(gender) # 未知
3.3 popitem() 方法——删除并返回最后一个键值对
popitem() 在 Python 3.7+ 中删除并返回字典中最后插入的一个键值对(LIFO),以元组形式返回。在旧版本中随机删除。
student = {"name": "小明", "age": 18, "city": "北京"}item = student.popitem()print(item) # ('city', '北京')print(student) # {'name': '小明', 'age': 18}
如果字典为空,调用 popitem() 会引发 KeyError。
3.4 clear() 方法——清空所有键值对
student = {"name": "小明", "age": 18}student.clear()print(student) # {}
四、查找与访问字典元素(查)
4.1 通过键直接访问 dict[键]
student = {"name": "小明", "age": 18}print(student["name"]) # 小明# print(student["gender"]) # KeyError
如果键不存在,会抛出 KeyError,因此通常配合 in 检查或使用 get()。
4.2 get() 方法——安全获取值
get(key[, default]) 返回键对应的值,如果键不存在则返回 default(默认 None)。
student = {"name": "小明", "age": 18}print(student.get("name")) # 小明print(student.get("gender")) # Noneprint(student.get("gender", "未知")) # 未知
4.3 setdefault() 方法——获取或设置默认值
setdefault(key[, default]) 如果键存在,返回其值;如果键不存在,插入该键并设置为 default(默认为 None),然后返回该值。
student = {"name": "小明", "age": 18}age = student.setdefault("age", 20)print(age) # 18(原值)print(student) # {'name': '小明', 'age': 18}gender = student.setdefault("gender", "男")print(gender) # 男(新插入的值)print(student) # {'name': '小明', 'age': 18, 'gender': '男'}
4.4 使用 in 检查键是否存在
student = {"name": "小明", "age": 18}if"age"in student:print("年龄存在")if"score"notin student:print("分数不存在")
4.5 获取所有键、值、键值对
- •
keys():返回所有键的视图(可迭代、类似集合)。 - •
items():返回所有键值对的视图,每个元素是 (键, 值) 元组。
student = {"name": "小明", "age": 18, "city": "北京"}print(student.keys()) # dict_keys(['name', 'age', 'city'])print(student.values()) # dict_values(['小明', 18, '北京'])print(student.items()) # dict_items([('name', '小明'), ('age', 18), ('city', '北京')])# 可以转换为列表keys_list = list(student.keys())print(keys_list) # ['name', 'age', 'city']# 遍历for key, value in student.items():print(f"{key}: {value}")
注意: 这些视图是动态的,字典变化时视图也会实时更新。
4.6 获取字典长度 len()
student = {"name": "小明", "age": 18}print(len(student)) # 2
五、复制字典
字典是可变对象,直接赋值 dict2 = dict1 只是引用同一个对象,修改一个会影响另一个。因此需要复制。
5.1 浅拷贝 copy()
original = {"name": "小明", "scores": [85, 92]}copy_dict = original.copy()copy_dict["name"] = "小红"# 修改不可变值,不影响原字典copy_dict["scores"].append(95) # 修改列表(可变对象),会影响原字典print(original) # {'name': '小明', 'scores': [85, 92, 95]}print(copy_dict) # {'name': '小红', 'scores': [85, 92, 95]}
5.2 深拷贝 deepcopy
如果希望完全独立,包括内部可变对象,需用 copy.deepcopy。
import copyoriginal = {"name": "小明", "scores": [85, 92]}deep_copy = copy.deepcopy(original)deep_copy["scores"].append(95)print(original) # {'name': '小明', 'scores': [85, 92]}print(deep_copy) # {'name': '小明', 'scores': [85, 92, 95]}
六、实战案例
案例1:学生成绩管理系统
defstudent_scores(): scores = {}whileTrue:print("\n1. 添加/修改成绩")print("2. 删除学生")print("3. 查询成绩")print("4. 显示所有学生")print("0. 退出") choice = input("请选择:")if choice == '1': name = input("学生姓名:") score = int(input("成绩:")) scores[name] = scoreprint("已保存")elif choice == '2': name = input("要删除的学生:")if name in scores: scores.pop(name)print("已删除")else:print("学生不存在")elif choice == '3': name = input("要查询的学生:") score = scores.get(name)if score isnotNone:print(f"{name} 的成绩是 {score}")else:print("学生不存在")elif choice == '4':if scores:for name, score in scores.items():print(f"{name}: {score}")else:print("暂无数据")elif choice == '0':break
案例2:统计单词出现次数
text = "apple banana apple orange banana apple"words = text.split()word_count = {}for word in words: word_count[word] = word_count.get(word, 0) + 1print(word_count) # {'apple': 3, 'banana': 2, 'orange': 1}
案例3:字典嵌套操作
# 存储多个学生信息students = {}students["001"] = {"name": "张三", "age": 20}students["002"] = {"name": "李四", "age": 21}# 修改嵌套值students["001"]["age"] = 22print(students["001"]) # {'name': '张三', 'age': 22}# 添加嵌套键值对students["002"]["score"] = 95print(students["002"]) # {'name': '李四', 'age': 21, 'score': 95}
案例4:使用 setdefault 简化计数
# 用 setdefault 实现计数word_count = {}for word in words: word_count.setdefault(word, 0) word_count[word] += 1# 不过通常用 get 更简洁
七、注意事项总结
- 1. 键必须可哈希:字典的键必须是不可变类型(整数、浮点数、字符串、元组等)。列表、字典等可变类型不能作为键。
- 2. 键唯一性:如果添加的键已存在,则更新其值,不会创建新项。
- 3. 直接访问(
d[key]) 键不存在会引发 KeyError,建议用 get() 安全访问。 - 4.
pop() 与 del:pop() 返回被删除的值,而 del 不返回。 - 5. 视图动态性:
keys()、values()、items() 返回的视图会随原字典变化,且支持集合运算(keys() 和 items())。 - 6. Python 3.7+ 字典有序:字典会保持插入顺序,因此
popitem() 删除的是最后插入的项。 - 7. 浅拷贝 vs 深拷贝:当字典值包含可变对象时,浅拷贝可能导致意外共享,必要时使用
copy.deepcopy。 - 8. 性能:字典的查找、插入、删除操作平均时间复杂度为 O(1),非常高效。
八、总结
- • 增加/修改:
d[key] = value、d.update(other) - • 删除:
del d[key]、d.pop(key)、d.popitem()、d.clear() - • 查找:
d[key]、d.get(key)、d.setdefault(key)、key in d、d.keys()、d.values()、d.items() - • 其他:
len(d)、d.copy()、copy.deepcopy(d)
掌握字典的增删改查是 Python 数据处理的基础,通过大量练习,你会越来越熟练。