一、前言
在 Python 中,字典(dict) 是一种非常灵活且常用的数据结构,支持动态修改。我们可以在程序运行过程中对字典进行添加(增)、删除(删)、修改(改) 操作。
本文将系统性地介绍 Python 字典中常见的增删改操作方法,并结合大量代码示例和注意事项,帮助你掌握这些基础但至关重要的技能。
二、字典的基本特性回顾
- ✅ 无序性:Python 3.7+ 开始默认保持插入顺序;
- ✅ 可变性:可以随时添加、删除或修改其中的键值对;
- ✅ 键唯一性:每个键必须唯一,重复键会被覆盖;
- ✅ 值多样性:值可以是任意类型;
- ✅ 键不可变性:键必须是不可变类型(如字符串、数字、元组);
例如:
my_dict = {'name': 'Alice', 'age': 25}
三、字典元素的“增”操作
1. 直接通过键赋值添加新元素
这是最简单也最常用的添加方式:
my_dict['gender'] = 'female'
print(my_dict) # {'name': 'Alice', 'age': 25, 'gender': 'female'}
如果键不存在,则会新增一个键值对。
2. 使用 .update() 方法批量更新或添加
.update() 可以传入另一个字典或可迭代对象来更新当前字典:
my_dict.update({'city': 'Beijing', 'email': 'alice@example.com'})
print(my_dict)
# {'name': 'Alice', 'age': 25, 'gender': 'female', 'city': 'Beijing', 'email': 'alice@example.com'}
也可以传入列表形式的键值对:
my_dict.update([('phone', '123456'), ('hobby', 'reading')])
3. 使用 setdefault() 添加默认值(仅当键不存在时)
setdefault(key, default) 方法会在键不存在时设置默认值并返回该值:
value = my_dict.setdefault('score', 90)
print(value) # 90
print(my_dict) # {'name': 'Alice', 'age': 25, 'gender': 'female', 'score': 90}
✅ 特点:
- 如果键存在,不会改变原有值;
- 非常适合用于初始化计数器、缓存等场景。
四、字典元素的“删”操作
1. 删除指定键:del dict[key]
del my_dict['age']
print(my_dict) # {'name': 'Alice', 'gender': 'female', 'score': 90}
⚠️ 如果键不存在,会抛出
KeyError异常。
2. 删除并返回指定键的值:.pop(key[, default])
age = my_dict.pop('age', 0) # 设置默认值避免异常
print(age) # 0
print(my_dict) # {'name': 'Alice', 'gender': 'female', 'score': 90}
如果不提供默认值且键不存在,会抛出 KeyError。
3. 删除最后一个插入的键值对(Python 3.7+):.popitem()
key, value = my_dict.popitem()
print(f"被删除的项:{key} -> {value}")
⚠️ 在 Python 3.7+ 中,它会删除最后插入的键值对;否则行为不确定。
4. 清空整个字典:.clear()
my_dict.clear()
print(my_dict) # {}
5. 删除整个字典变量:del dict_name
del my_dict
print(my_dict) # 报错:NameError: name 'my_dict' is not defined
五、字典元素的“改”操作
1. 直接通过键修改值
可以直接通过已有的键名重新赋值:
my_dict['score'] = 85
print(my_dict) # {'score': 85}
2. 使用 .update() 修改多个键值
可以传入包含已有键的新值来批量修改:
my_dict.update({'score': 92, 'name': 'Bob'})
print(my_dict) # {'score': 92, 'name': 'Bob'}
3. 使用 .setdefault() 安全修改(只在键存在时)
虽然 .setdefault() 主要用于添加默认值,但它也能配合逻辑判断用于修改:
if 'score' in my_dict:
my_dict['score'] += 5
或者更简洁写法:
my_dict['score'] = my_dict.get('score', 0) + 5
4. 使用字典推导式批量修改符合条件的值
scores = {'math': 75, 'english': 85, 'physics': 65}
updated_scores = {k: v + 5 if v < 80 else v for k, v in scores.items()}
print(updated_scores) # {'math': 80, 'english': 85, 'physics': 70}
六、常见问题与注意事项
| 问题 | 原因 | 解决方法 |
|---|---|---|
| KeyError | 访问了不存在的键 | 使用 .get() 或 in 判断是否存在 |
| 删除不存在的键 | 调用 .pop() 时未找到键 | 提供默认值或先判断存在 |
| 修改原始字典时遍历 | 遍历时修改可能导致索引混乱 | 使用副本进行操作:for key in list(dict.keys()) |
| 大量数据频繁增删效率低 | 字典本身不适合极端情况下的性能优化 | 考虑使用 collections.defaultdict 或其他结构 |
七、总结对比表
| 操作 | 方法 | 是否安全 | 是否返回值 | 说明 |
|---|---|---|---|---|
| 添加元素 | d[key] = value | ❌ | ❌ | 最直接的方式 |
| 批量添加 | d.update(other) | ✅ | ❌ | 支持字典/列表等 |
| 安全添加 | d.setdefault(key, default) | ✅ | ✅ | 键不存在时添加 |
| 删除指定键 | del d[key] | ❌ | ❌ | 键必须存在 |
| 安全删除 | d.pop(key, default) | ✅ | ✅ | 推荐使用 |
| 删除最后一项 | d.popitem() | ✅(3.7+) | ✅ | 返回 (key, value) |
| 清空字典 | d.clear() | ✅ | ❌ | 对象仍存在 |
| 删除字典对象 | del d | ✅ | ❌ | 彻底删除变量 |
| 修改元素 | d[key] = new_value | ✅ | ❌ | 最直接的方法 |
| 批量修改 | d.update() / 推导式 | ✅ | ❌ | 更高效的方式 |
八、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!