Python基础之字典(Dictionary)全面指南
字典(Dictionary)是 Python 中一种强大的键值对存储结构,具有极高的灵活性和查找效率。本文将详细讲解字典的定义、特性、常用操作、深浅拷贝及应用场景,帮助你熟练掌握字典的使用技巧。
一、字典的基本定义与特性
1. 字典的格式
字典以键值对(key-value) 形式存储数据,格式为:
字典名 = {键1: 值1, 键2: 值2, ...}
- 键(key)与值(value)之间用冒号
:
分隔 - 键值对之间用逗号
,
分隔 - 整体包裹在大括号
{}
中 - 键必须是不可变类型(如字符串、数字、元组),且具有唯一性;值可以是任意数据类型(包括列表、字典等)
# 定义字典
dic = {'name': 'bingbing', 'age': 18, 'hobbies': ['reading', 'coding']}
print(type(dic)) # <class 'dict'># 键的唯一性:重复键会被覆盖
dic2 = {'name': 'bingbing', 'name': 'susu'}
print(dic2) # {'name': 'susu'}(后定义的键值对覆盖前面的)
2. 字典的核心特性
- 无序性:Python 3.7 之前字典是无序的,3.7 及以后保证插入顺序(但仍不支持下标访问)
- 可变性:支持动态添加、修改、删除键值对
- 高效查找:通过键查找值的时间复杂度为 O (1),远快于列表的遍历查找
二、字典的常用操作
1. 访问元素(查询)
字典不支持下标访问,需通过键名获取对应值,主要有两种方式:
方式 | 说明 | 示例 |
---|---|---|
字典名[键名] | 直接访问,键不存在则报错 | dic['age'] → 18 |
字典名.get(键名, 默认值) | 安全访问,键不存在返回 None 或指定默认值 | dic.get('tel', '未知') → ' 未知' |
dic = {'name': 'bingbing', 'age': 18}# 直接访问
print(dic['name']) # bingbing
# print(dic['sex']) # 报错:KeyError(键不存在)# get() 方法访问
print(dic.get('age')) # 18
print(dic.get('tel')) # None(默认返回)
print(dic.get('tel', '无')) # 无(指定默认值)
3. 删除元素
字典提供多种删除操作,适用于不同场景:
方法 | 说明 | 示例 |
---|---|---|
del 字典名[键名] | 删除指定键值对,键不存在则报错 | del dic['age'] |
del 字典名 | 删除整个字典,后续无法访问 | del dic |
字典名.clear() | 清空字典内容,保留空字典对象 | dic.clear() → {} |
字典名.pop(键名) | 删除指定键值对并返回对应值,键不存在则报错 | dic.pop('name') → 'bingbing' |
字典名.popitem() | Python 3.7+ 中删除最后一个键值对并返回该键值对(元组形式) | dic.popitem() → ('tel', '12345678') |
dic = {'name': 'bingbing', 'age': 18, 'tel': '12345678'}# pop() 删除并返回值
age = dic.pop('age')
print(age) # 18
print(dic) # {'name': 'bingbing', 'tel': '12345678'}# popitem() 删除最后一个键值对
last_item = dic.popitem()
print(last_item) # ('tel', '12345678')
print(dic) # {'name': 'bingbing'}# clear() 清空字典
dic.clear()
print(dic) # {}
4. 其他常用操作
- 获取长度:
len(字典名)
返回键值对的数量 - 获取所有键:
keys()
返回键的集合(可迭代) - 获取所有值:
values()
返回值的集合(可迭代) - 获取所有键值对:
items()
返回键值对元组的集合(可迭代)
dic = {'name': 'bingbing', 'age': 18, 'tel': '123'}# 长度
print(len(dic)) # 3# 所有键
print(dic.keys()) # dict_keys(['name', 'age', 'tel'])# 所有值
for value in dic.values():print(value) # 依次输出:bingbing、18、123# 所有键值对(常用于遍历)
for key, value in dic.items():print(f"{key}: {value}")
# 输出:
# name: bingbing
# age: 18
# tel: 123
三、字典的拷贝:浅拷贝与深拷贝
字典的拷贝涉及到可变对象和不可变对象的处理差异,需注意深浅拷贝的区别:
1. 浅拷贝(copy()
方法)
- 对不可变对象(如字符串、数字):拷贝值的副本,修改互不影响
- 对可变对象(如列表、字典):仅拷贝引用(共享内存地址),修改会相互影响
original = {'name': 'Alice', # 不可变对象(字符串)'scores': [85, 90], # 可变对象(列表)'details': {'city': 'New York'} # 可变对象(字典)
}# 浅拷贝
shallow_copy = original.copy()# 修改不可变对象(互不影响)
shallow_copy['name'] = 'zhangsan'
print(original['name']) # Alice(原字典不变)
print(shallow_copy['name']) # zhangsan(拷贝字典变化)# 修改可变对象(相互影响)
shallow_copy['scores'].append(95)
print(original['scores']) # [85, 90, 95](原字典被影响)
print(shallow_copy['scores']) # [85, 90, 95](拷贝字典变化)shallow_copy['details']['city'] = 'Shanghai'
print(original['details']) # {'city': 'Shanghai'}(原字典被影响)
2. 深拷贝(copy.deepcopy()
)
通过 copy
模块的 deepcopy()
实现,完全拷贝所有层级的对象(包括可变对象),原字典与拷贝字典完全独立,修改互不影响。
import copyoriginal = {'scores': [85, 90],'details': {'city': 'New York'}
}# 深拷贝
deep_copy = copy.deepcopy(original)# 修改可变对象(互不影响)
deep_copy['scores'].append(95)
deep_copy['details']['city'] = 'Shanghai'print(original['scores']) # [85, 90](原字典不变)
print(deep_copy['scores']) # [85, 90, 95](拷贝字典变化)print(original['details']) # {'city': 'New York'}(原字典不变)
print(deep_copy['details']) # {'city': 'Shanghai'}(拷贝字典变化)
四、字典的应用场景
字典凭借键值对的特性,在以下场景中应用广泛:
1. 存储结构化数据
适合表示具有多个属性的实体(如用户信息、商品详情等)。
user = {'id': 1001,'name': 'bingbing','info': {'age': 18, 'gender': 'female'}
}
2. 高效查找与映射
用于需要通过唯一标识快速定位数据的场景(如缓存、索引)。
# 用字典实现快速查询学生成绩
score_map = {'Alice': 90, 'Bob': 85, 'Cindy': 95}
print(score_map.get('Bob')) # 85(O(1) 时间复杂度)
3. 配置参数存储
适合存储程序的配置信息(如数据库连接参数)。
db_config = {'host': 'localhost','port': 3306,'user': 'root','password': '123456'
}
4. 计数与统计
通过键记录对象,值记录数量,实现高效计数。
# 统计字符串中字符出现次数
s = 'abracadabra'
count = {}
for char in s:count[char] = count.get(char, 0) + 1
print(count) # {'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}
五、补充:字典推导式
与列表推导式类似,字典推导式可快速创建字典,格式为:
{键表达式: 值表达式 for 变量 in 可迭代对象 if 条件}
# 示例1:创建值为键的平方的字典
square = {i: i**2 for i in range(1, 6)}
print(square) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}# 示例2:筛选值为偶数的键值对
original = {'a': 2, 'b': 3, 'c': 4, 'd': 5}
even_dict = {k: v for k, v in original.items() if v % 2 == 0}
print(even_dict) # {'a': 2, 'c': 4}
总结
字典作为 Python 中最灵活的数据结构之一,其键值对存储方式和高效查找特性使其在各类场景中不可或缺。本文核心要点:
- 字典以键值对存储,键唯一且不可变,值可任意类型
- 支持增删改查操作,
get()
方法可安全访问键值 - 浅拷贝对可变对象共享引用,深拷贝完全独立
- 适合存储结构化数据、高效查找、配置参数等场景