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模块美化输出
- 分步调试复杂操作
- 注意数据类型的一致性