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}

标签: 嵌套字典 深拷贝 遍历 树形结构 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python字典推导式 下一篇: Python集合创建与访问

poll相关推荐