嗨,小伙伴们!欢迎回来!上一节课我们学了流程控制,让程序学会了思考和重复。今天我们要学习Python中的数据结构,它们就像不同功能的收纳盒,能帮你把数据整理得清清楚楚。
一、为什么需要数据结构?
想象一下,你要存储全班50个同学的姓名。如果用普通变量,你需要写50个变量名,那太麻烦了!而用列表这个数据结构,一个变量就能装下所有姓名。数据结构就是专门用来组织和存储数据的工具。
二、列表:有序的收纳盒
列表是Python中最常用的数据结构,用方括号表示,里面的数据按顺序排列。
python
# 创建一个列表names =["小明","小红","小刚","小丽"]print(names)# 输出:['小明', '小红', '小刚', '小丽']# 获取列表中的某个元素(索引从0开始)print(names[0])# 输出:小明print(names[2])# 输出:小刚# 修改列表中的元素names[1]="小芳"print(names)# 输出:['小明', '小芳', '小刚', '小丽']# 往列表末尾添加新元素names.append("小强")print(names)# 输出:['小明', '小芳', '小刚', '小丽', '小强']# 删除列表中的元素del names[3]# 删除索引为3的元素(小丽)print(names)# 输出:['小明', '小芳', '小刚', '小强']# 获取列表长度print(len(names))# 输出:4列表里的元素可以是不同类型的数据:
python
mix_list =["小明",18,175.5,True]print(mix_list)# 输出:['小明', 18, 175.5, True]
三、遍历列表:用for循环逐个处理
学了for循环,正好用来遍历列表:
python
fruits =["苹果","香蕉","橘子","葡萄"]for fruit in fruits:print(f"我喜欢吃{fruit}")# 输出:# 我喜欢吃苹果# 我喜欢吃香蕉# 我喜欢吃橘子# 我喜欢吃葡萄如果想同时拿到索引和元素,可以用enumerate函数:
python
for index, fruit inenumerate(fruits):print(f"第{index+1}个水果是{fruit}")# 输出:# 第1个水果是苹果# 第2个水果是香蕉# 第3个水果是橘子# 第4个水果是葡萄四、列表的常用操作
4.1 切片:获取列表的一部分
python
numbers =[0,1,2,3,4,5,6,7,8,9]# 获取前3个元素print(numbers[0:3])# 输出:[0, 1, 2]# 简写形式(从开头到索引3)print(numbers[:3])# 输出:[0, 1, 2]# 获取索引3到6的元素print(numbers[3:7])# 输出:[3, 4, 5, 6]# 获取后3个元素print(numbers[7:])# 输出:[7, 8, 9]# 获取所有偶数索引的元素print(numbers[::2])# 输出:[0, 2, 4, 6, 8]
4.2 常用列表方法
python
scores =[85,92,78,90,88]# 添加元素scores.append(95)# 末尾添加print(scores)# 输出:[85, 92, 78, 90, 88, 95]# 插入元素scores.insert(2,80)# 在索引2的位置插入80print(scores)# 输出:[85, 92, 80, 78, 90, 88, 95]# 删除元素scores.remove(78)# 删除值为78的元素print(scores)# 输出:[85, 92, 80, 90, 88, 95]# 排序scores.sort()# 升序排序print(scores)# 输出:[80, 85, 88, 90, 92, 95]scores.sort(reverse=True)# 降序排序print(scores)# 输出:[95, 92, 90, 88, 85, 80]# 求和、最大值、最小值print(sum(scores))# 输出:530print(max(scores))# 输出:95print(min(scores))# 输出:80
五、元组:不可变的列表
元组和列表很像,但用圆括号表示,而且一旦创建就不能修改。
python
# 创建元组colors =("红","黄","蓝")print(colors)# 输出:('红', '黄', '蓝')# 获取元素(和列表一样)print(colors[0])# 输出:红# 尝试修改(会报错)# colors[1] = "绿" # 这行会报错:TypeError# 元组的长度print(len(colors))# 输出:3# 遍历元组for color in colors:print(color)什么时候用元组?当你希望数据不会被意外修改时,比如一周的天数、一年的月份:
python
weekdays =("周一","周二","周三","周四","周五","周六","周日")六、字典:带标签的收纳盒
字典用花括号表示,里面的数据是键值对形式,每个元素都有一个唯一的键(标签)和对应的值。
python
# 创建字典student ={"name":"小明","age":18,"score":95,"city":"北京"}print(student)# 输出:{'name': '小明', 'age': 18, 'score': 95, 'city': '北京'}# 通过键获取值print(student["name"])# 输出:小明print(student["age"])# 输出:18# 修改值student["score"]=98print(student["score"])# 输出:98# 添加新键值对student["gender"]="男"print(student)# 输出:{'name': '小明', 'age': 18, 'score': 98, 'city': '北京', 'gender': '男'}# 删除键值对del student["city"]print(student)# 输出:{'name': '小明', 'age': 18, 'score': 98, 'gender': '男'}6.1 遍历字典
python
# 遍历所有键for key in student:print(f"{key}: {student[key]}")# 或者用items方法同时获取键和值for key, value in student.items():print(f"{key}: {value}")# 输出:# name: 小明# age: 18# score: 98# gender: 男# 只获取所有键print(student.keys())# 输出:dict_keys(['name', 'age', 'score', 'gender'])# 只获取所有值print(student.values())# 输出:dict_values(['小明', 18, 98, '男'])6.2 字典的常用操作
python
# 检查键是否存在if"name"in student:print("name存在")# 安全获取值(如果键不存在,返回默认值)print(student.get("height","没有这个信息"))# 输出:没有这个信息# 获取字典长度(键值对个数)print(len(student))# 输出:4七、集合:去重的无序盒子
集合用花括号表示,里面的元素不能重复,而且没有顺序。
python
# 创建集合fruits ={"苹果","香蕉","橘子","苹果","葡萄"}print(fruits)# 输出:{'橘子', '葡萄', '苹果', '香蕉'}(重复的苹果只出现一次,顺序可能不同)# 添加元素fruits.add("西瓜")print(fruits)# 输出:{'橘子', '葡萄', '苹果', '香蕉', '西瓜'}# 删除元素fruits.remove("橘子")print(fruits)# 输出:{'葡萄', '苹果', '香蕉', '西瓜'}# 集合运算(非常强大)class_a ={"小明","小红","小刚","小丽"}class_b ={"小刚","小丽","小强","小芳"}# 交集(两个班都有的学生)print(class_a & class_b)# 输出:{'小丽', '小刚'}# 并集(两个班所有的学生)print(class_a | class_b)# 输出:{'小明', '小红', '小刚', '小丽', '小强', '小芳'}# 差集(在A班但不在B班的学生)print(class_a - class_b)# 输出:{'小明', '小红'}八、综合案例:学生成绩管理系统
把今天学的知识结合起来,写一个简单的学生成绩管理系统:
python
# 存储学生信息(字典的列表)students =[{"name":"小明","chinese":85,"math":92,"english":78},{"name":"小红","chinese":90,"math":88,"english":95},{"name":"小刚","chinese":78,"math":85,"english":82},{"name":"小丽","chinese":92,"math":96,"english":89}]# 显示所有学生信息print("学生成绩单")print("="*40)for student in students: total = student["chinese"]+ student["math"]+ student["english"] avg = total /3print(f"{student['name']}: 语文{student['chinese']} 数学{student['math']} 英语{student['english']} 总分{total} 平均分{avg:.1f}")# 计算各科平均分chinese_sum =0math_sum =0english_sum =0for student in students: chinese_sum += student["chinese"] math_sum += student["math"] english_sum += student["english"]print("="*40)print(f"语文平均分:{chinese_sum/len(students):.1f}")print(f"数学平均分:{math_sum/len(students):.1f}")print(f"英语平均分:{english_sum/len(students):.1f}")# 找出总分最高的学生top_student =max(students, key=lambda s: s["chinese"]+ s["math"]+ s["english"])total_score = top_student["chinese"]+ top_student["math"]+ top_student["english"]print(f"总分最高:{top_student['name']},总分{total_score}")运行效果:
text
学生成绩单========================================小明: 语文85 数学92 英语78 总分255 平均分85.0小红: 语文90 数学88 英语95 总分273 平均分91.0小刚: 语文78 数学85 英语82 总分245 平均分81.7小丽: 语文92 数学96 英语89 总分277 平均分92.3========================================语文平均分:86.2数学平均分:90.2英语平均分:86.0总分最高:小丽,总分277
九、新手避坑指南
9.1 常见错误及解决方法
| | |
|---|
| list = [1,2,3]
print(list[3]) | 记住索引从0开始,最大索引是len(list)-1 |
| tup = (1,2,3)
tup[0] = 5 | |
| d = {"a":1}
print(d["b"]) | |
| list1 = [1,2,3]
list2 = list1
list2[0] = 5
print(list1) | =是引用传递,用list2 = list1.copy()创建副本 |
| empty_set = {} | |
9.2 三个实用小贴士
列表推导式:快速创建列表的简洁写法
python
# 生成1到10的平方数squares =[x**2for x inrange(1,11)]print(squares)# 输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]# 筛选出偶数evens =[x for x inrange(1,21)if x %2==0]print(evens)# 输出:[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
用in检查成员:非常方便
python
fruits =["苹果","香蕉","橘子"]if"香蕉"in fruits:print("有香蕉")# 字符串也是序列text ="Hello Python"if"Python"in text:print("找到了Python")多变量赋值:从列表或元组中一次性取出多个值
python
# 从列表解包info =["小明",18,"北京"]name, age, city = infoprint(name)# 小明print(age)# 18print(city)# 北京# 交换变量a, b =10,20a, b = b, aprint(a, b)# 20 10
十、总结与下一步
恭喜你!现在你已经掌握了Python中最重要的几种数据结构:
✅ 列表:有序、可变的序列,用方括号[]
✅ 元组:有序、不可变的序列,用圆括号()
✅ 字典:键值对的无序集合,用花括号{},通过键访问
✅ 集合:无序、不重复的元素集合,用花括号{}或set()
这些数据结构是Python编程的基础,几乎每个程序都会用到它们。选择哪种数据结构,取决于你的需求:
需要按顺序存储数据 → 用列表
数据不需要修改 → 用元组
需要通过名字查找数据 → 用字典
需要去重或集合运算 → 用集合
下一步,我们将学习函数——把代码打包成可重复使用的模块,让程序更简洁、更强大。函数就像是你自己创造的Python指令,想用的时候随时调用!
记住那句老话:编程不是看会的,而是练会的。赶紧打开你的Python环境,把文中的例子亲手敲一遍,再试着修改数据、增加功能,看看会发生什么有趣的变化。有任何问题,欢迎在评论区留言交流!
下期预告:Python函数:把代码打包成可重复使用的“魔法盒子”,让编程事半功倍!敬请期待!