Python 字典核心用法:11 个方法详解
引言
字典(Dictionary)是 Python 中最常用的数据结构之一,它用于存放具有映射关系的数据。字典由键(key)和值(value)成对组成,键和值中间以冒号 隔开,项之间用逗号 隔开,整个字典由大括号 括起来。
Python 字典作为哈希表实现的数据结构,支持高效的键值对存储与检索。文章系统介绍了字典的创建方式,并详细解析了 clear、copy、fromkeys、get、items、keys、pop、popitem、setdefault、update、values 等 11 个核心方法。内容涵盖浅拷贝与深拷贝的区别、键值获取策略、字典更新机制以及常见使用陷阱,配合完整代码示例,帮助开发者全面掌握字典操作技巧。

字典(Dictionary)是 Python 中最常用的数据结构之一,它用于存放具有映射关系的数据。字典由键(key)和值(value)成对组成,键和值中间以冒号 隔开,项之间用逗号 隔开,整个字典由大括号 括起来。
:,{}dic = {key1: value1, key2: value2}
字典也被称作关联数组或哈希表。其底层基于哈希表实现,平均时间复杂度为 O(1),非常适合需要快速查找、插入和删除数据的场景。需要注意的是,字典的键必须是不可变类型(如字符串、数字、元组),而值可以是任意对象。
除了直接定义外,Python 提供了多种创建字典的方法:
dic1 = {'Author': '示例', 'age': 99, 'sex': '男'}
lst = [('Author', '示例'), ('age', 99), ('sex', '男')]
dic2 = dict(lst)
dic3 = dict(Author='示例', age=99, sex='男')
list1 = ['Author', 'age', 'sex']
list2 = ['示例', 99, '男']
dic4 = dict(zip(list1, list2))
# 生成键为 0-4,值为对应平方数的字典
dic5 = {x: x**2 for x in range(5)}
字典由 dict 类代表,可以使用 dir(dict) 查看该类包含的方法。以下重点介绍最常用的 11 种方法:
clear() 用于清空字典中所有元素(键 - 值对)。执行后,该字典变为空字典,但对象本身依然存在。
list1 = ['Author', 'age', 'sex']
list2 = ['示例', 99, '男']
dic1 = dict(zip(list1, list2))
print(f'清空前:{dic1}') # {'Author': '示例', 'age': 99, 'sex': '男'}
dic1.clear()
print(f'清空后:{dic1}') # {}
注意: 此操作会修改原字典对象,若存在引用该字典的其他变量,它们也会看到空字典。
copy() 返回一个字典的浅拷贝。浅拷贝只复制第一层对象,如果字典中包含可变对象(如列表),这些子对象仍会被共享。
import copy
list1 = ['Author', 'age', 'sex']
list2 = ['示例', [18, 99], '男']
dic1 = dict(zip(list1, list2))
# 浅拷贝
dic3 = dic1.copy()
# 深拷贝
dic4 = copy.deepcopy(dic1)
# 修改嵌套列表
dic1['age'].remove(18)
dic1['age'] = 20
print(f'dic1: {dic1}') # {'Author': '示例', 'age': 20, 'sex': '男'}
print(f'dic3: {dic3}') # {'Author': '示例', 'age': [99], 'sex': '男'} (子对象受影响)
print(f'dic4: {dic4}') # {'Author': '示例', 'age': [18, 99], 'sex': '男'} (完全独立)
拓展: 对于嵌套结构复杂的字典,务必使用 copy.deepcopy() 以避免数据污染。
fromkeys() 使用给定的多个键创建一个新字典,值默认都是 None,也可以传入一个参数作为默认值。
list1 = ['Author', 'age', 'sex']
# 默认值为 None
dic1 = dict.fromkeys(list1)
print(f'dic1: {dic1}') # {'Author': None, 'age': None, 'sex': None}
# 指定默认值
dic2 = dict.fromkeys(list1, '示例')
print(f'dic2: {dic2}') # {'Author': '示例', 'age': '示例', 'sex': '示例'}
注意: 如果默认值是可变对象(如列表),所有键将共享同一个对象引用。
get() 用于返回指定键的值。在键不存在的情况下,返回 None,也可以指定返回值。
list1 = ['Author', 'age', 'sex']
list2 = ['示例', [18, 99], '男']
dic1 = dict(zip(list1, list2))
# 获取存在的键
Author = dic1.get('Author')
print(f'Author: {Author}') # 示例
# 获取不存在的键,默认返回 None
phone = dic1.get('phone')
print(f'phone: {phone}') # None
# 获取不存在的键,指定默认值
phone = dic1.get('phone', '12345678')
print(f'phone: {phone}') # 12345678
优势: 相比直接使用 dic[key],get() 不会抛出 KeyError 异常,更安全。
items() 获取字典中的所有键 - 值对,返回一个视图对象(view object),通常可转化为列表处理。
list1 = ['Author', 'age', 'sex']
list2 = ['示例', [18, 99], '男']
dic1 = dict(zip(list1, list2))
items = dic1.items()
print(f'items: {items}') # dict_items([('Author', '示例'), ('age', [18, 99]), ('sex', '男')])
print(f'type: {type(items)}') # <class 'dict_items'>
print(f'list: {list(items)}') # [('Author', '示例'), ('age', [18, 99]), ('sex', '男')]
用途: 常用于遍历字典同时获取键和值。
keys() 返回一个字典所有的键,同样返回视图对象。
list1 = ['Author', 'age', 'sex']
list2 = ['示例', [18, 99], '男']
dic1 = dict(zip(list1, list2))
keys = dic1.keys()
print(f'keys: {keys}') # dict_keys(['Author', 'age', 'sex'])
print(f'list: {list(keys)}') # ['Author', 'age', 'sex']
用途: 检查某个键是否存在于字典中(if key in dic.keys():),虽然直接用 if key in dic: 更高效。
pop() 返回指定键对应的值,并在原字典中删除这个键 - 值对。如果键不存在且未提供默认值,则抛出 KeyError。
list1 = ['Author', 'age', 'sex']
list2 = ['示例', [18, 99], '男']
dic1 = dict(zip(list1, list2))
sex = dic1.pop('sex')
print(f'sex: {sex}') # 男
print(f'dic1: {dic1}') # {'Author': '示例', 'age': [18, 99]}
# 键不存在时提供默认值
result = dic1.pop('name', '默认值')
print(f'result: {result}') # 默认值
popitem() 删除并返回字典中的最后一对键和值。在 Python 3.7+ 中,字典保持插入顺序,因此它删除的是最后插入的元素。
list1 = ['Author', 'age', 'sex']
list2 = ['示例', [18, 99], '男']
dic1 = dict(zip(list1, list2))
last_item = dic1.popitem()
print(f'last_item: {last_item}') # ('sex', '男')
print(f'dic1: {dic1}') # {'Author': '示例', 'age': [18, 99]}
注意: 不能对空字典调用此方法,否则会抛出 KeyError。
setdefault() 类似于 get(),但如果键不存在于字典中,将会添加键并将值设为默认值,然后返回该值。
list1 = ['Author', 'age', 'sex']
list2 = ['示例', [18, 99], '男']
dic1 = dict(zip(list1, list2))
# 键已存在,不修改
dic1.setdefault('Author', '当打之年')
print(f'dic1: {dic1}') # Author 仍为 '示例'
# 键不存在,添加
dic1.setdefault('name', '当打之年')
print(f'dic1: {dic1}') # 新增 name: '当打之年'
用途: 常用于初始化嵌套字典或确保键存在。
update() 将另一个字典的键 - 值对更新到当前字典中。如果被更新的字典中已包含对应的键 - 值对,那么原键 - 值对会被覆盖;如果不包含,则添加该键 - 值对。
list1 = ['Author', 'age', 'sex']
list2 = ['示例', [18, 99], '男']
dic1 = dict(zip(list1, list2))
list3 = ['Author', 'phone']
list4 = ['更新后', 12345678]
dic2 = dict(zip(list3, list4))
dic1.update(dic2)
print(f'dic1: {dic1}') # Author 被覆盖,新增 phone
注意: update 可以接受关键字参数或另一个字典对象。
values() 返回一个字典所有的值,返回视图对象。
list1 = ['Author', 'age', 'sex']
list2 = ['示例', [18, 99], '男']
dic1 = dict(zip(list1, list2))
values = dic1.values()
print(f'values: {values}') # dict_values(['示例', [18, 99], '男'])
print(f'list: {list(values)}') # ['示例', [18, 99], '男']
items() 而非分别调用 keys() 和 values()。RuntimeError。应遍历副本或使用列表推导式过滤。本文详细解析了 Python 字典的 11 个核心方法。掌握这些方法不仅能提高代码效率,还能避免常见的逻辑错误。在实际开发中,建议根据具体场景选择合适的方法,例如使用 get() 处理可选字段,使用 setdefault() 初始化配置,使用 update() 合并数据源。通过灵活运用字典及其方法,可以构建更健壮、更易维护的数据处理流程。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online