Python 字典基础与进阶用法详解
在 Python 中,字典(Dictionary)是一种可变容器模型,且可存储任意类型对象。字典的每个键值对(Key-Value)用冒号(:)分割,每个键值对之间用逗号(,)分割,整个字典包括在花括号({})中。
Python 字典(Dictionary)的核心概念与使用方法。内容涵盖字典的定义与多种创建方式(字面量、dict 函数、推导式)、基本操作(增删改查)、核心内置方法(clear、copy、get、pop、update 等)以及遍历技巧。此外,文章还深入探讨了嵌套字典、性能特征(O(1) 查找)、键的不可变性约束以及常见开发陷阱,并提供完整的代码示例。通过阅读,读者可以系统掌握 Python 字典的基础知识与进阶用法,从而在数据处理和算法实现中更高效地运用这一重要数据结构。

在 Python 中,字典(Dictionary)是一种可变容器模型,且可存储任意类型对象。字典的每个键值对(Key-Value)用冒号(:)分割,每个键值对之间用逗号(,)分割,整个字典包括在花括号({})中。
字典是 Python 中最常用的数据结构之一,它提供了高效的查找、插入和删除操作。理解并掌握字典的使用对于编写高效、健壮的 Python 代码至关重要。
最直接的方式是使用花括号直接定义字典:
phonebook = {'宁波': '0574', '台州': '0576', '杭州': '0571'}
print(phonebook)
# 输出:{'宁波': '0574', '台州': '0576', '杭州': '0571'}
可以通过其他映射或(键,值)对序列建立字典:
items = [('name', 'Alice'), ('age', 28)]
d = dict(items)
print(d)
# 输出:{'name': 'Alice', 'age': 28}
或者使用关键字参数形式(注意键名必须是合法的标识符):
d = dict(name='Alice', age=28)
print(d)
# 输出:{'name': 'Alice', 'age': 28}
类似于列表推导式,字典也支持推导式,用于快速生成字典:
squares = {x: x**2 for x in range(5)}
print(squares)
# 输出:{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
通过键索引可以访问或修改字典中的值:
phonebook = {'宁波': '0574', '台州': '0576', '杭州': '0571'}
# 访问
print(phonebook['宁波']) # 输出:'0574'
# 修改
phonebook['宁波'] = '0574-8888'
# 增加新项
phonebook['绍兴'] = '0573'
print(phonebook)
# 输出:{'宁波': '0574-8888', '台州': '0576', '杭州': '0571', '绍兴': '0573'}
如果键不存在,直接访问会抛出 KeyError 异常,建议使用 get() 方法安全访问。
可以使用 del 语句或字典方法删除键值对:
phonebook = {'宁波': '0574', '台州': '0576', '杭州': '0571'}
# 删除指定键
if '台州' in phonebook:
del phonebook['台州']
# 检查键是否存在
print('绍兴' in phonebook) # True
print('台州' in phonebook) # False
使用内置函数 len() 获取字典中键值对的数量:
print(len(phonebook))
Python 字典提供了一系列内置方法来处理数据,以下是常用方法的详细说明。
清除字典中所有项目,返回 None。
phonebook = {'宁波': '0574', '台州': '0576'}
x = phonebook.clear()
print(phonebook) # 输出:{}
print(x) # 输出:None
返回一个具有相同键 - 值对的新字典。如果是嵌套对象,只复制引用。
original = {'a': 1, 'b': [1, 2]}
copied = original.copy()
copied['b'].append(3)
print(original) # 输出:{'a': 1, 'b': [1, 2, 3]} (受影响)
print(copied) # 输出:{'a': 1, 'b': [1, 2, 3]}
如需深拷贝,需使用 copy 模块中的 deepcopy。
使用给定的键建立新的字典,键的默认值为 None 或指定值。
keys = ['name', 'age', 'city']
y = dict.fromkeys(keys, 'Unknown')
print(y)
# 输出:{'name': 'Unknown', 'age': 'Unknown', 'city': 'Unknown'}
访问字典中的项,即使项不存在时,也不会出错,而是返回 None 或指定的默认值。
x = {'name': 'Alice', 'age': 28}
print(x.get('name')) # 输出:Alice
print(x.get('addr')) # 输出:None
print(x.get('addr', 'N/A')) # 输出:N/A (自定义默认值)
注:Python 3.0 已不再包含这个函数,推荐使用 in 表达式。
# 旧写法 (Python 2)
# print x.has_key('name')
# 推荐写法 (Python 3)
print('name' in x) # True
print('addr' in x) # False
将字典的所有项、键或值以视图对象(类似列表)方式返回。
x = {'age': 28, 'name': 'Alice'}
# items: 返回 (key, value) 元组列表
print(list(x.items()))
# 输出:[('age', 28), ('name', 'Alice')]
# keys: 返回 key 列表
print(list(x.keys()))
# 输出:['age', 'name']
# values: 返回 value 列表
print(list(x.values()))
# 输出:[28, 'Alice']
返回对应给定键的值,再将该键值对从原字典中删除。如果键不存在,可选择抛出异常或返回默认值。
x = {'name': 'Alice', 'age': 28}
val = x.pop('name')
print(val) # 输出:Alice
print(x) # 输出:{'age': 28}
# 防止 KeyError
val = x.pop('gender', 'Male')
print(val) # 输出:Male
弹出字典的一项(在 Python 3.7+ 中按插入顺序弹出最后一项)。
x = {'no.1': 1, 'no.2': 2, 'no.3': 3}
item = x.popitem()
print(item) # 输出:('no.3', 3)
print(x) # 输出:{'no.1': 1, 'no.2': 2}
与 get() 类似,键存在返回对应值;但给定键不存在时,返回默认值后会将该键值对更新到字典中。
x = {'name': 'Alice', 'age': 28}
# 键存在
print(x.setdefault('name')) # 输出:Alice
print(x) # 不变
# 键不存在,添加新项
print(x.setdefault('addr', 'N/A')) # 输出:N/A
print(x) # 输出:{'name': 'Alice', 'age': 28, 'addr': 'N/A'}
可以用一个字典项更新另外一个字典,关键字存在时改变其对应值,关键字不存在时添加新项。
x = {'name': 'Alice', 'age': 28}
y = {'age': 25, 'phone': '0571-12345'}
x.update(y)
print(x)
# 输出:{'name': 'Alice', 'age': 25, 'phone': '0571-12345'}
for key in phonebook:
print(key)
for value in phonebook.values():
print(value)
for k, v in phonebook.items():
print(f'{k}: {v}')
字典可以作为另一个字典的值,形成嵌套结构,常用于表示复杂的数据层级。
user_info = {
'id': 1,
'profile': {
'name': 'Bob',
'location': 'Hangzhou'
},
'tags': ['developer', 'python']
}
print(user_info['profile']['name']) # 输出:Bob
字典基于哈希表实现,平均时间复杂度为 O(1)。这使得它在需要频繁查找的场景下非常高效。但是,字典的键必须是不可变类型(如字符串、数字、元组),不能是列表或字典。
# 错误示例:列表作为键
# d = {[1, 2]: 'value'} # TypeError: unhashable type: 'list'
# 正确示例:元组作为键
d = {(1, 2): 'value'}
RuntimeError。Python 字典是处理键值对数据的强大工具。通过灵活运用上述方法和技巧,可以构建出逻辑清晰、性能优异的程序。在实际开发中,应优先使用 get() 进行安全访问,利用 update() 合并数据,并注意键的不可变性要求。掌握字典的高级用法,将大大提升你的 Python 编程效率。
本文档旨在提供全面的 Python 字典技术指南,涵盖从基础语法到高级应用的最佳实践。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online