欢迎回来!上一课我们让程序学会了自动化处理列表里的每一个元素。但生活不总是“全都要”,更多时候我们只关心一部分:比如榜单前三名、一周的前五天、或者上个月的订单记录。这时候,就需要拿出我们的“魔法剪刀”——切片(Slicing) 了。
小提示 :可以把列表想象成一根法棍面包,切片就是用它切出你想要的其中一段。你只需要告诉Python:“从这儿切到那儿,给我这一块。”
1. 初试剪刀:如何切出切片
切片的语法非常直观:在列表名后面加上一个方括号,里面用冒号分隔起始索引和结束索引:列表名[起始索引:结束索引]。
和range()函数类似,切片也是“顾头不顾尾”——包含起始索引的元素,但不包含结束索引的元素。
python
我们还是用那个熟悉的列表
players = ['查尔斯', '马丁', '迈克尔', '弗洛伦斯', '刘易斯']
print("我们的完整列表:", players)
切出第2个到第4个元素(索引1到索引3)
包含索引1的'马丁',包含索引2的'迈克尔',不包含索引3的'弗洛伦斯'?等等,需要仔细看!
正确的:索引1到索引3,包含1和2,不包含3?不对,索引3是'弗洛伦斯',如果目标是2-4名,应该是索引1到索引4
更清晰的例子:获取第2、3、4名队员(索引1、2、3)
slice_players = players[1:4] # 从索引1开始,到索引4之前停止(即索引1,2,3)
print(f"第2到第4名队员是:{slice_players}") # 输出:['马丁', '迈克尔', '弗洛伦斯']
获取前3名队员(索引0、1、2)
top3 = players[0:3]
print(f"前三名:{top3}") # 输出:['查尔斯', '马丁', '迈克尔']
代码拆解一下:
2. 切片的几种“快捷手法”
如果你经常切面包,就会知道有些切法很常用,Python也为这些情况提供了快捷方式。
python
players = ['查尔斯', '马丁', '迈克尔', '弗洛伦斯', '刘易斯']
1. 从开头切到指定位置:省略起始索引
获取前3名队员(等价于 [0:3])
first_three = players[:3]
print(f"省略起始,前三人:{first_three}") # 输出:['查尔斯', '马丁', '迈克尔']
2. 从指定位置切到末尾:省略结束索引
获取后3名队员(从索引2到结束)
last_three = players[2:]
print(f"省略结束,后三人:{last_three}") # 输出:['迈克尔', '弗洛伦斯', '刘易斯']
3. 复制整个列表:同时省略起始和结束索引
copy_of_players = players[:]
print(f"列表的完整副本:{copy_of_players}") # 输出整个列表
print(f"验证是否是副本:{copy_of_players is players}") # 输出:False (说明是两个不同的列表)
重要提醒 :players[:]创建了一个全新的列表,内容与原列表一样。这和直接赋值new_list = players不同,后者只是给原列表起了个别名,两个变量指向同一个列表,修改其中一个会影响另一个。
3. 遍历切片:处理部分元素
切片的结果本身就是一个新列表,所以它可以和for循环完美配合,让你只处理列表中的部分元素。
python
players = ['查尔斯', '马丁', '迈克尔', '弗洛伦斯', '刘易斯']
print("宣布本次比赛的前三名:")
只遍历切片中的前三位队员
for player in players[:3]:
print(f" 优胜者:{player}")
输出:
宣布本次比赛的前三名:
优胜者:查尔斯
优胜者:马丁
优胜者:迈克尔
4. 实战演练:用切片分析数据
假设我们有一周七天的销售额,想快速看一下前五天的“工作日”表现和后两天的“周末”表现。
python
sales = [120, 85, 90, 110, 95, 200, 180]
days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
工作日销售额(前5天)
weekday_sales = sales[:5]
print(f"工作日销售额:{weekday_sales},平均为:{sum(weekday_sales)/5:.1f}")
周末销售额(后2天)
weekend_sales = sales[5:]
print(f"周末销售额:{weekend_sales},平均为:{sum(weekend_sales)/2:.1f}")
输出:
工作日销售额:[120, 85, 90, 110, 95],平均为:100.0
周末销售额:[200, 180],平均为:190.0
九、动手练习:玩转你的“魔法剪刀”
今天你学会了如何灵活地裁剪列表。请用这些新技能解决下面几个小问题:
榜单切片:
创建一个包含至少8个你最爱电影(或书籍、歌曲)的列表,命名为my_favorites。
打印消息:“我的前3名是:”,然后通过切片打印前三个项目。
打印消息:“我的最后2名是:”,然后通过切片打印最后两个项目。
打印消息:“我的中间最爱(第3到第5部)是:”,然后通过切片打印索引2到4的项目。
自助餐复盘:
有一个自助餐厅的菜品列表:buffet = ('沙拉', '面包', '汤', '牛排', '蛋糕')(这其实是元组,但我们可以先把它当作列表来练习切片)。
请用切片取出并打印餐厅提供的“前菜部分”(前两个菜品)和“主菜部分”(中间两个菜品)。
好友的副本:
创建你的好友列表my_friends = ['小明', '小红', '小刚', '小丽']。
使用切片创建my_friends的一个副本,命名为friends_copy。
分别向原列表my_friends和副本friends_copy中添加一个不同的新朋友。
打印两个列表,观察它们是否各自独立,互不影响。
结束语
恭喜你,现在你不仅能让程序自动化处理列表,还能像用剪刀一样精准地裁出你需要的部分。切片是处理数据时的高频技巧,非常实用。有了循环和切片这两样武器,你已经能应对很多有趣的编程任务了。
明天,我们将正式认识Python中另一个重要的结构——元组。它像是列表的“不可变”版本,在某些场景下能保护你的数据不被意外修改。就像一个带有封印的“不变列表”,敬请期待!
有任何疑问或想展示你的“裁剪”成果,欢迎在评论区留言。代码越敲越顺,我们明天见!