跳转至

Python嵌套数据结构完整指南

1. 什么是嵌套数据结构?想象一下...

想象你有一个神奇的俄罗斯套娃!每个娃娃里面还可以放入其他娃娃,形成层层嵌套的结构。在Python中,我们的数据结构也可以这样嵌套:列表中可以包含字典,字典的值可以是列表,等等。

2. 基本嵌套类型

2.1. 列表嵌套列表

# 创建一个二维列表(矩阵)
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# 访问元素
print(matrix[0][1])  # 输出:2
print(matrix[1][2])  # 输出:6

# 修改元素
matrix[0][0] = 10

2.2. 字典嵌套字典

# 创建嵌套字典
school = {
    "一年级": {
        "班级1": {
            "班主任": "张老师",
            "学生人数": 45
        },
        "班级2": {
            "班主任": "李老师",
            "学生人数": 42
        }
    }
}

# 访问数据
print(school["一年级"]["班级1"]["班主任"])  # 输出:张老师

# 修改数据
school["一年级"]["班级2"]["学生人数"] = 43

2.3. 列表嵌套字典

# 创建列表嵌套字典
students = [
    {"name": "小明", "age": 12, "scores": {"语文": 85, "数学": 92}},
    {"name": "小红", "age": 11, "scores": {"语文": 88, "数学": 95}}
]

# 访问数据
print(students[0]["name"])  # 输出:小明
print(students[1]["scores"]["数学"])  # 输出:95

# 添加新数据
students.append({"name": "小华", "age": 12, "scores": {"语文": 90, "数学": 88}})

2.4. 字典嵌套列表

# 创建字典嵌套列表
class_scores = {
    "语文": [85, 88, 90, 92],
    "数学": [92, 95, 89, 88],
    "英语": [78, 82, 85, 90]
}

# 计算平均分
for subject, scores in class_scores.items():
    avg = sum(scores) / len(scores)
    print(f"{subject}平均分:{avg}")

# 添加新成绩
class_scores["语文"].append(87)

3. 高级操作

3.1. 深层访问和修改

# 多层嵌套的数据结构
data = {
    "班级A": {
        "学生": [
            {"name": "小明", "scores": [85, 92, 78]},
            {"name": "小红", "scores": [88, 95, 82]}
        ]
    }
}

# 深层访问
print(data["班级A"]["学生"][0]["scores"][1])  # 输出:92

# 深层修改
data["班级A"]["学生"][1]["scores"][0] = 90

3.2. 列表推导式与嵌套

# 创建嵌套列表
matrix = [[i+j for j in range(3)] for i in range(0, 9, 3)]
print(matrix)  # 输出:[[0, 1, 2], [3, 4, 5], [6, 7, 8]]

# 展平嵌套列表
flat = [num for row in matrix for num in row]
print(flat)  # 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8]

3.3. 字典推导式与嵌套

# 创建嵌套字典
students = ["小明", "小红", "小华"]
subjects = ["语文", "数学"]
scores = {
    student: {subject: 0 for subject in subjects}
    for student in students
}

# 更新成绩
for student in scores:
    for subject in scores[student]:
        scores[student][subject] = 85  # 示例分数

4. 实战应用

4.1. 成绩管理系统

# 创建一个完整的成绩管理系统
grade_system = {
    "班级信息": {
        "名称": "一年级一班",
        "班主任": "张老师",
        "学生总数": 3
    },
    "学生成绩": [
        {
            "学号": "001",
            "姓名": "小明",
            "成绩": {
                "语文": [85, 88, 90],  # 多次考试成绩
                "数学": [92, 95, 89],
                "英语": [78, 82, 85]
            }
        },
        {
            "学号": "002",
            "姓名": "小红",
            "成绩": {
                "语文": [88, 85, 92],
                "数学": [95, 89, 93],
                "英语": [82, 86, 88]
            }
        }
    ]
}

# 计算每个学生的各科平均分
for student in grade_system["学生成绩"]:
    print(f"\n学生:{student['姓名']}")
    for subject, scores in student["成绩"].items():
        avg = sum(scores) / len(scores)
        print(f"{subject}平均分:{avg:.2f}")

4.2. 购物车系统

# 创建一个购物车系统
shopping_system = {
    "用户信息": {
        "用户名": "张三",
        "会员等级": "金牌",
        "积分": 1000
    },
    "购物车": [
        {
            "商品编号": "A001",
            "商品名称": "Python编程书",
            "数量": 2,
            "单价": 79.9,
            "优惠": {
                "折扣": 0.8,
                "满减": 30
            }
        },
        {
            "商品编号": "B002",
            "商品名称": "笔记本",
            "数量": 3,
            "单价": 15.5,
            "优惠": {
                "折扣": 0.9,
                "满减": 0
            }
        }
    ]
}

# 计算总价
total = 0
for item in shopping_system["购物车"]:
    price = item["单价"] * item["数量"]
    discount_price = price * item["优惠"]["折扣"] - item["优惠"]["满减"]
    total += discount_price
    print(f"{item['商品名称']}折后价:{discount_price:.2f}")

print(f"\n购物车总价:{total:.2f}")

5. 最佳实践

5.1. 设计原则

  • 保持结构清晰,避免过度嵌套
  • 使用有意义的键名
  • 考虑数据的访问和修改频率

5.2. 性能考虑

  • 深层嵌套会影响访问速度
  • 合理使用浅拷贝和深拷贝
  • 注意内存使用效率

5.3. 调试技巧

  • 使用pprint模块美化输出
  • 分步调试复杂操作
  • 注意数据类型的一致性

6. 进一步学习