pin_drop当前位置:知识文库 ❯ 图文
Python嵌套字典
概述
嵌套字典是指字典的值也是字典或包含字典的复杂数据结构。它用于表示多层级的数据,如学生信息、配置系统、JSON 数据等。掌握嵌套字典的访问、修改和遍历是处理复杂数据的基础。
创建嵌套字典
代码示例
students = {
"Alice": {"math": 95, "english": 88, "science": 92},
"Bob": {"math": 78, "english": 85, "science": 90},
"Charlie": {"math": 92, "english": 95, "science": 88}
}
print(students)输出:
代码示例
{'Alice': {'math': 95, 'english': 88, 'science': 92}, 'Bob': {'math': 78, 'english': 85, 'science': 90}, 'Charlie': {'math': 92, 'english': 95, 'science': 88}}逐步构建
代码示例
data = {}
data["users"] = {}
data["users"]["admin"] = {"role": "admin", "active": True}
data["users"]["guest"] = {"role": "guest", "active": False}
print(data)访问嵌套字典
代码示例
students = {
"Alice": {"math": 95, "english": 88, "science": 92},
"Bob": {"math": 78, "english": 85, "science": 90}
}
alice_math = students["Alice"]["math"]
print(f"Alice的数学成绩: {alice_math}")输出:
代码示例
Alice的数学成绩: 95安全访问
代码示例
math = students.get("Alice", {}).get("math")
print(f"数学成绩: {math}")
missing = students.get("Eve", {}).get("math", "不存在")
print(f"Eve的成绩: {missing}")输出:
代码示例
数学成绩: 95
Eve的成绩: 不存在修改嵌套字典
代码示例
students = {
"Alice": {"math": 95, "english": 88}
}
students["Alice"]["math"] = 98
students["Alice"]["science"] = 92
print(students)输出:
代码示例
{'Alice': {'math': 98, 'english': 88, 'science': 92}}添加新键
代码示例
students["David"] = {"math": 85, "english": 90}
print(students)遍历嵌套字典
代码示例
students = {
"Alice": {"math": 95, "english": 88},
"Bob": {"math": 78, "english": 85}
}
for name, scores in students.items():
print(f"{name}:")
for subject, score in scores.items():
print(f" {subject}: {score}")输出:
代码示例
Alice:
math: 95
english: 88
Bob:
math: 78
english: 85嵌套推导式
代码示例
averages = {
name: sum(scores.values()) / len(scores)
for name, scores in students.items()
}
print(averages)输出:
代码示例
{'Alice': 91.5, 'Bob': 81.5}嵌套字典的拷贝问题
嵌套字典使用浅拷贝时,内部字典仍然是共享的:
代码示例
import copy
original = {
"user1": {"name": "Alice", "age": 25}
}
shallow = original.copy()
shallow["user1"]["age"] = 26
print("原字典:", original)
print("浅拷贝:", shallow)输出:
代码示例
原字典: {'user1': {'name': 'Alice', 'age': 26}}
浅拷贝: {'user1': {'name': 'Alice', 'age': 26}}提示:嵌套字典必须使用
copy.deepcopy()才能完全独立。
代码示例
deep = copy.deepcopy(original)
deep["user1"]["age"] = 27
print("原字典:", original)
print("深拷贝:", deep)输出:
代码示例
原字典: {'user1': {'name': 'Alice', 'age': 26}}
深拷贝: {'user1': {'name': 'Alice', 'age': 27}}常见应用场景
树形结构
代码示例
tree = {
"root": {
"left": {"value": 1, "children": {}},
"right": {
"value": 2,
"children": {
"leaf": {"value": 3}
}
}
}
}分组数据
代码示例
data = {
"2024": {"Q1": 100, "Q2": 150, "Q3": 200},
"2025": {"Q1": 180, "Q2": 220}
}
print(data["2025"]["Q2"])注意事项
提示:深度访问:访问深层嵌套时要逐层检查,避免
KeyError。
提示:浅拷贝问题:嵌套字典的浅拷贝会共享内部字典,修改时影响原数据。
提示:替代方案:对于复杂的多层级数据,可考虑使用类或
dataclasses。
小结
-
嵌套字典使用多层
[key]访问 -
遍历嵌套字典使用嵌套循环
-
嵌套字典的拷贝必须使用
deepcopy() -
适合表示树形结构、配置和分组数据
常见问题
如何安全访问深层嵌套字典?
使用链式 get() 方法:data.get("level1", {}).get("level2", {}).get("level3", "default")。每层提供空字典作为默认值,避免 KeyError。
嵌套字典的浅拷贝有什么问题?
浅拷贝只复制最外层字典,内部字典仍然是共享引用。修改嵌套字典中的值会影响原字典。必须使用 deepcopy() 才能完全独立。
嵌套字典太深时有什么替代方案?
可以使用类、dataclasses、或专门的嵌套字典库(如 addict、glom)来简化访问和管理。对于复杂结构,建议定义数据模型类。
如何遍历嵌套字典的所有层级?
对于已知层级的嵌套字典,使用嵌套循环。对于未知深度的嵌套字典,可以使用递归函数遍历所有层级。
练习1
编写一个函数 calculate_averages(students),接收嵌套字典 {"Alice": {"math": 95, "english": 88}, "Bob": {"math": 78, "english": 85}},返回每个学生的平均分。
练习2
编写一个递归函数 flatten_dict(d, parent_key="", sep="."),将嵌套字典展平为一层字典。例如 {"a": 1, "b": {"c": 2, "d": {"e": 3}}} → {"a": 1, "b.c": 2, "b.d.e": 3}。
本文涉及AI创作
内容由AI创作,请仔细甄别