Python 字典基础用法与高级特性详解
前言
字典(Dictionary)是 Python 中一种常用的数据结构,用于存储键值对(key-value pairs)。它是内置的映射类型,支持动态地添加、删除和修改其中的元素。字典在数据处理、配置管理、缓存实现等场景中应用极为广泛。
Python 字典是一种可变的键值对集合数据结构,支持动态添加、删除和修改元素。其核心特点包括键的唯一性、无序性以及基于哈希的高效查找能力。本文详细讲解了字典的创建方式、常用操作方法如增删改查、遍历技巧以及字典推导式等高级特性。通过实际案例演示了如何在学生管理、词频统计等场景中应用字典,并分析了性能优化与常见陷阱,帮助开发者掌握这一 Python 核心数据结构的最佳实践。

字典(Dictionary)是 Python 中一种常用的数据结构,用于存储键值对(key-value pairs)。它是内置的映射类型,支持动态地添加、删除和修改其中的元素。字典在数据处理、配置管理、缓存实现等场景中应用极为广泛。
# 创建一个空字典
empty_dict = {}
print(empty_dict) # 输出:{}
# 创建一个包含键值对的字典
person = {'name': 'John', 'age': 30, 'city': 'New York'}
print(person)
# 使用 dict() 函数创建字典
# 方式一:传入关键字参数
car = dict(brand='Toyota', model='Camry', year=2020)
print(car)
# 方式二:传入可迭代的键值对列表
info = dict([('name', 'Alice'), ('age', 25)])
print(info)
键必须是不可变的数据类型,因为字典内部使用键的哈希值来定位数据。常见的合法键类型包括:
以下类型不能作为键:
值可以是任意数据类型,包括不可变类型和可变类型。例如,值可以是另一个字典或列表。
# 字符串作为键
person = {'name': 'John', 'age': 30}
# 整数作为键
scores = {1: 90, 2: 85, 3: 95}
# 元组作为键
student = {('John', 'Doe'): 12345, ('Jane', 'Smith'): 67890}
# 列表作为值
grades = {'math': [90, 85, 95], 'english': [80, 75, 85]}
# 字典作为值
info = {'person': {'name': 'John', 'age': 30}}
可以使用方括号 [] 或 get() 方法访问值。
person = {'name': 'John', 'age': 30}
# 直接访问,若键不存在会抛出 KeyError
try:
print(person['name']) # 输出:John
except KeyError:
print("KeyError")
# 使用 get 方法,若键不存在返回 None 或指定默认值
print(person.get('name')) # 输出:John
print(person.get('gender')) # 输出:None
print(person.get('gender', 'Unknown')) # 输出:Unknown
可以通过赋值的方式修改现有键的值,或添加新的键值对。
person = {'name': 'John', 'age': 30}
# 修改值
person['age'] = 31
print(person) # 输出:{'name': 'John', 'age': 31}
# 添加新键值对
person['gender'] = 'Male'
print(person) # 输出:{'name': 'John', 'age': 31, 'gender': 'Male'}
# 使用 update 方法批量更新
person.update({'city': 'Beijing', 'age': 32})
print(person) # 输出:{'name': 'John', 'age': 32, 'gender': 'Male', 'city': 'Beijing'}
# 使用 setdefault 设置默认值(仅当键不存在时)
person.setdefault('country', 'China')
print(person) # 输出:包含 country: China
可以使用 del 关键字、pop() 或 clear() 方法。
person = {'name': 'John', 'age': 31, 'city': 'Beijing'}
# 使用 del 删除
if 'city' in person:
del person['city']
print(person) # 输出:{'name': 'John', 'age': 31}
# 使用 pop 删除并返回值
removed_age = person.pop('age')
print(removed_age) # 输出:31
print(person) # 输出:{'name': 'John'}
# 使用 popitem 随机删除最后一个键值对(Python 3.7+ 按插入顺序)
last_item = person.popitem()
print(last_item) # 输出:('name', 'John')
# 清空字典
person.clear()
print(person) # 输出:{}
可以使用 keys(), values(), items() 配合循环遍历。
person = {'name': 'John', 'age': 31, 'city': 'Beijing'}
# 遍历键
for key in person.keys():
print(key)
# 遍历值
for value in person.values():
print(value)
# 遍历键值对
for key, value in person.items():
print(f"{key}: {value}")
使用 in 关键字。
if "name" in person:
print("Name exists")
else:
print("Name does not exist")
字典推导式允许通过简洁的语法快速创建字典。
# 将列表转换为字典,键为索引,值为元素
nums = [1, 2, 3, 4]
squared = {i: i**2 for i in nums}
print(squared) # 输出:{0: 1, 1: 4, 2: 9, 3: 16} (注意 range 示例更常见)
# 更常见的用法:过滤和转换
squares = {x: x*x for x in range(10) if x % 2 == 0}
print(squares) # 输出:{0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
# 合并两个字典
a = {1: 'one', 2: 'two'}
b = {3: 'three'}
c = {**a, **b}
print(c) # 输出:{1: 'one', 2: 'two', 3: 'three'}
d = {'a': 1, 'b': 2, 'c': 3}
# 获取长度
print(len(d)) # 输出:3
# 获取所有键(返回列表)
print(list(d.keys()))
# 获取所有值(返回列表)
print(list(d.values()))
# 排序字典(按键)
sorted_d = sorted(d.items())
print(sorted_d)
由于字典基于哈希表,它在需要频繁查找的场景下比列表更高效。
TypeError,因为可变对象无法计算稳定的哈希值。RuntimeError。应复制字典或使用列表保存键。# 错误示例:尝试用列表做键
# my_dict = {[1, 2]: 'value'} # TypeError: unhashable type: 'list'
# 正确做法:遍历副本
original = {'a': 1, 'b': 2, 'c': 3}
for k in list(original.keys()):
if original[k] > 1:
del original[k]
text = "hello world hello python"
words = text.split()
count = {}
for word in words:
count[word] = count.get(word, 0) + 1
print(count) # 输出:{'hello': 2, 'world': 1, 'python': 1}
students = {}
def add_student(student_id, name, score):
students[student_id] = {'name': name, 'score': score}
def get_student(student_id):
return students.get(student_id)
def update_score(student_id, new_score):
if student_id in students:
students[student_id]['score'] = new_score
def delete_student(student_id):
if student_id in students:
del students[student_id]
# 测试
add_student(1001, 'Alice', 90)
add_student(1002, 'Bob', 85)
print(get_student(1001)) # 输出:{'name': 'Alice', 'score': 90}
update_score(1001, 95)
print(get_student(1001)) # 输出:{'name': 'Alice', 'score': 95}
delete_student(1002)
print(len(students)) # 输出:1
字典常用于存储程序配置项,便于集中管理和读取。
config = {
'database': {
'host': 'localhost',
'port': 5432,
'user': 'admin'
},
'logging': {
'level': 'INFO',
'file': 'app.log'
}
}
# 安全访问嵌套配置
db_host = config.get('database', {}).get('host', 'default_host')
print(db_host) # 输出:localhost
Python 字典是开发者必须掌握的核心数据结构之一。它提供了高效的键值映射能力,支持丰富的操作方法。理解其底层哈希机制、掌握正确的使用场景以及避免常见陷阱,能够显著提升代码的性能和健壮性。在实际开发中,结合字典推导式和标准库工具类(如 collections.Counter),可以编写出更加简洁高效的代码。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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