Python 字典使用指南
字典是 Python 中的可变映射类型,以键值对的形式存储数据。
1. 字典创建
# 使用花括号创建
dict1 = {'name': '张三', 'age': 25}
dict2 = {'a': 1, 'b': 2, 'c': 3}
# 使用 dict() 函数创建
dict3 = dict(name='李四', age=30)
dict4 = dict([('a', 1), ('b', 2)]) # 从序列创建
# 使用字典推导式创建
dict5 = {x: x**2 for x in range(5)}
print(dict5) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 创建空字典
empty_dict1 = {}
empty_dict2 = dict()
2. 字典操作
2.1 访问元素
student = {'name': '张三', 'age': 25, 'city': '北京'}
# 使用键访问
print(student['name']) # 输出: 张三
# 使用 get() 方法(推荐)
print(student.get('age')) # 输出: 25
print(student.get('score', 0)) # 键不存在时返回默认值
# 获取所有键、值、键值对
print(student.keys()) # 获取所有键
print(student.values()) # 获取所有值
print(student.items()) # 获取所有键值对
2.2 修改和添加元素
student = {'name': '张三', 'age': 25}
# 添加/修改单个元素
student['city'] = '北京' # 添加新键值对
student['age'] = 26 # 修改已存在的值
# 批量更新
student.update({'score': 90, 'grade': 'A'})
# 设置默认值
student.setdefault('gender', '男') # 如果键不存在则设置默认值
2.3 删除元素
student = {'name': '张三', 'age': 25, 'city': '北京'}
# 删除指定键值对
del student['age'] # 使用 del 语句
city = student.pop('city') # 删除并返回值
last = student.popitem() # 删除并返回最后一个键值对
# 清空字典
student.clear() # 删除所有元素
3. 字典方法
3.1 常用方法
student = {'name': '张三', 'age': 25}
# 复制字典
student_copy = student.copy() # 浅拷贝
import copy
student_deep = copy.deepcopy(student) # 深拷贝
# 合并字典
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
dict1.update(dict2) # 将 dict2 合并到 dict1
# 检查键是否存在
print('name' in student) # 使用 in 运算符
3.2 视图对象
student = {'name': '张三', 'age': 25}
# 获取视图对象
keys = student.keys() # 键视图
values = student.values() # 值视图
items = student.items() # 键值���视图
# 视图会随字典变化而变化
student['city'] = '北京'
print(keys) # 包含新添加的键
4. 字典推导式
# 基本字典推导式
squares = {x: x**2 for x in range(5)}
# 带条件的字典推导式
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
# 从两个列表创建字典
names = ['张三', '李四', '王五']
ages = [25, 30, 35]
name_age = {name: age for name, age in zip(names, ages)}
# 键值转换
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {v: k for k, v in dict1.items()} # 键值互换
5. 实用示例
5.1 数据统计
# 词频统计
text = "hello world hello python hello world"
word_count = {}
for word in text.split():
word_count[word] = word_count.get(word, 0) + 1
print(word_count)
# 分组统计
students = [
{'name': '张三', 'class': '一班'},
{'name': '李四', 'class': '二班'},
{'name': '王五', 'class': '一班'}
]
class_students = {}
for student in students:
class_name = student['class']
class_students.setdefault(class_name, []).append(student['name'])
5.2 缓存实现
# 简单的缓存装饰器
def cache_decorator(func):
cache = {}
def wrapper(*args):
if args in cache:
return cache[args]
result = func(*args)
cache[args] = result
return result
return wrapper
@cache_decorator
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
6. 性能考虑
# 使用 dict.get() 而不是异常处理
# 好的方式
value = my_dict.get('key', default_value)
# 避免的方式
try:
value = my_dict['key']
except KeyError:
value = default_value
# 合并字典的高效方式
# Python 3.5+
dict3 = {**dict1, **dict2}
# 检查多个键
required_keys = {'name', 'age', 'city'}
has_all_keys = required_keys.issubset(student.keys())
注意事项
- 字典键必须是可哈希的(不可变类型)
- 字典是无序的(Python 3.7+ 保持插入顺序)
- 使用 get() 方法避免键不存在时的异常
- 注意深浅拷贝的区别
- 字典推导式要保持简洁易读