Python字典使用详解
目录
一、简介
二、关键知识
1、创建字典
2、 访问元素
3、 添加/修改元素
4、删除元素
选择建议
5、遍历字典
(1)keys()
总结
6、合并字典
核心特性
适用场景
核心特性
增强赋值运算符 |=
使用建议
性能与内存考虑
一、简介
Python中的字典(dict
)是一种非常重要的数据结构,它用于存储键值对(key-value pairs)。字典的特点是查找速度快、灵活易用。
键(Key):必须是不可变类型(如字符串、数字、元组),且唯一。
值(Value):可以是任意数据类型(字符串、数字、列表、甚至另一个字典)。
二、关键知识
1、创建字典
{}
或 dict()
构造函数:d1 = {'name': 'Alice', 'age': 25}
d2 = dict(name='Bob', age=30)
print(d1) #输出 {'name': 'Alice', 'age': 25}
print(d2) #输出 {'name': 'Bob', 'age': 30}
2、 访问元素
get()
方法:3、 添加/修改元素
d1 = {'name': 'Alice', 'age': 25}
d2 = dict(name='Bob', age=30)
print(d1['name']) # 输出: Alice
print(d1.get('age')) # 输出: 25
print(d1.get('address', 'N/A')) # 不存在时返回默认值'N/A'
d1['address'] = 'New York' # 添加新键
print(d1)
d1['age'] = 26 # 修改现有键
print(d1)
运行结果:
4、删除元素
(1) del
语句
语法:del dict[key]
行为:
直接删除指定键的键值对。
无返回值,仅执行删除操作。
错误处理:
若键不存在,抛出 KeyError
。
适用场景:
无需获取被删除的值时。
确定键存在,或希望缺失键时抛出错误。
d = {'a': 1, 'b': 2, 'c': 3}
del d['b']
print(d) # 输出: {'a': 1, 'c': 3}
(2) pop()
方法
语法:dict.pop(key[, default])
行为:
删除指定键的键值对,返回对应的值。
支持设置默认值(default
),避免键不存在时抛出错误。
错误处理:
若键不存在且未提供默认值,抛出 KeyError
。
若键不存在但提供默认值,返回默认值而不修改字典。
适用场景:
需要获取被删除的值时。
处理可能不存在的键(通过默认值避免错误)。
d = {'a': 1, 'b': 2}
value = d.pop('b') # 删除键'b',返回2
print(value, d) # 输出: 2 {'a': 1}
value = d.pop('x', 'N/A') # 键不存在,返回'N/A'
print(value) # 输出: N/A
(3) popitem()
方法
语法:dict.popitem()
行为:
删除并返回字典中的最后一个键值对(Python 3.7+ 因字典有序性)。
返回格式为 (key, value)
元组。
错误处理:
若字典为空,抛出 KeyError
。
适用场景:
按插入顺序删除元素(如实现栈、缓存淘汰策略)。
需要同时获取键和值。
d = {'a': 1, 'b': 2, 'c': 3}
item = d.popitem() # 删除并返回('c', 3)
print(item, d) # 输出: ('c', 3) {'a': 1, 'b': 2}
(4)clear()
清空字典。
my_dict.clear() # 结果: {}
特性 | del dict[key] |
dict.pop(key) |
dict.popitem() |
---|---|---|---|
返回值 | 无 | 被删除的值 | 被删除的键值对元组 (k, v) |
参数 | 必须指定键 | 必须指定键(可设默认值) | 无参数 |
错误处理 | 键不存在时抛出 KeyError |
键不存在时默认抛错或返回默认值 | 字典为空时抛出 KeyError |
适用场景 | 简单删除,无需返回值 | 需获取值或处理缺失键 | 按顺序删除或获取键值对 |
选择建议
使用 del
:直接删除键且不关心值。
使用 pop()
:需要获取被删除的值或处理可能缺失的键。
使用 popitem()
:按插入顺序删除元素(如LIFO场景)或需要键值对元组。
5、遍历字典
(1)keys()
功能:返回字典所有键的视图。
d = {'a': 1, 'b': 2, 'c': 3}
keys_view = d.keys()
print(keys_view) # 输出: dict_keys(['a', 'b', 'c'])
# 动态更新示例
d['d'] = 4
print(keys_view) # 输出: dict_keys(['a', 'b', 'c', 'd'])
(2) values()
功能:返回字典所有值的视图。
values_view = d.values()
print(values_view) # 输出: dict_values([1, 2, 3, 4])
(3) items()
功能:返回字典所有键值对的视图(元组形式 (key, value)
)。
items_view = d.items()
print(items_view) # 输出: dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
总结
keys()
:动态访问键,支持集合操作。
values()
:动态访问值,但无法保证唯一性或哈希性。
items()
:动态访问键值对,支持集合操作(键值对需哈希)。
(4)遍历所有键
for key in student.keys():
print(key)
# 输出:
# name
# age
# courses
(5)遍历所有值
for value in student.values():
print(value)
# 输出:
# Alice
# 20
# ['Math', 'Physics']
(6)遍历所有键值对
for key, value in student.items():
print(f"{key}: {value}")
# 输出:
# name: Alice
# age: 20
# courses: ['Math', 'Physics']
6、合并字典
(1)update()
方法
核心特性
原地修改:直接修改原字典,无返回值(返回None
)。
覆盖规则:合并时,相同键的值由新字典覆盖旧值。
版本兼容:适用于所有Python版本。
支持多字典合并:需多次调用或循环处理。
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
d1.update(d2) # 原地修改d1
print(d1) # 输出: {'a': 1, 'b': 3, 'c': 4}
适用场景
需要直接修改原字典。
合并多个字典(通过循环或链式调用):
dicts = [d1, d2, d3]
result = {}
for d in dicts:
result.update(d)
(2)|
运算符
核心特性
生成新字典:返回合并后的新字典,原字典不变。
覆盖规则:右侧字典的键覆盖左侧的同名键。
版本要求:仅Python 3.9+ 支持。
链式合并:可直接合并多个字典(如 d1 | d2 | d3
)。
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
d3 = d1 | d2 # 生成新字典
print(d3) # 输出: {'a': 1, 'b': 3, 'c': 4}
print(d1) # 原字典不变: {'a': 1, 'b': 2}
增强赋值运算符 |=
update()
,d1 |= d2 # 等效于 d1 = d1 | d2(原地修改)
print(d1) # 输出: {'a': 1, 'b': 3, 'c': 4}
使用建议
选择 update()
的场景:
需要原地修改原字典。
代码需兼容Python 3.9以下版本。
合并少量字典或需要精确控制合并顺序。
选择 |
运算符的场景:
需保留原字典不变,生成新字典。
使用Python 3.9+ 且追求代码简洁性。
链式合并多个字典(如 d1 | d2 | d3
)。
性能与内存考虑
update()
:原地操作,内存效率高,适合频繁修改或大字典。
|
:生成新字典,可能增加内存占用,适合不可变数据或链式操作。
7、补充
(1)in
关键字
检查键是否存在。
if 'name' in my_dict:
print("键存在")
(2)len(dict)
返回字典键的数量。
print(len(my_dict)) # 输出: 3
(3) copy()
创建字典的浅拷贝。
new_dict = my_dict.copy()
(4) fromkeys(keys, value)
通过键列表创建新字典,值统一为 value
。
keys = ['a', 'b', 'c']
new_dict = dict.fromkeys(keys, 0) # {'a': 0, 'b': 0, 'c': 0}
8、字典推导式
squares = {x: x**2 for x in range(5)} # {0:0, 1:1, 2:4, 3:9, 4:16}
reversed_dict = {v: k for k, v in d1.items()} # 反转键值
9、其他操作
检查存在性:'name' in d1
返回 True
。
长度:len(d1)
返回键的数量。
排序:sorted(d1.items(), key=lambda x: x[1])
按值排序键值对。
默认字典:from collections import defaultdict
自动处理缺失键。
嵌套字典:
students = {
'Alice': {'age': 25, 'grades': [90, 85]},
'Bob': {'age': 22, 'grades': [78, 88]}
}
print(students['Alice']['grades'][0]) # 输出: 90
注意事项:
键的要求:必须为不可变类型(如字符串、数字、元组)。
有序性:字典保持插入顺序。
性能:基于哈希表,查找、插入、删除平均O(1)时间复杂度。
深浅拷贝:d.copy()
浅拷贝,copy.deepcopy()
深拷贝。
【例】安全删除遍历元素
d = {'a': 1, 'b': 2, 'c': 3}
for key in list(d.keys()): # 转换为列表避免遍历时修改
if key == 'b':
del d[key]
print(d) # 输出: {'a': 1, 'c': 3}
作者:晨曦543210