首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python列表切片操作详解

列表切片是Python中最强大且实用的功能之一,它允许我们获取列表的子集而无需修改原列表。切片操作不仅语法简洁,而且性能高效。

1. 基本切片语法

切片的基本语法为:list[start:stop:step]

这三个参数共同决定了切片的范围和方式:

1.1 start(起始索引)

定义

:切片的开始位置(包含该位置)

默认值

:当省略或为None时,默认为0(正向步长)或-1(反向步长)

特点

可以是正整数(从前向后计数)或负整数(从后向前计数)

如果超出列表范围,会自动调整为有效边界值

当step为负时,start应大于stop才有意义

nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 正索引示例

print(nums[3:])    # 从索引3开始 [3, 4, 5, 6, 7, 8, 9]

# 负索引示例

print(nums[-4:])   # 从倒数第4个开始 [6, 7, 8, 9]

# 边界处理

print(nums[100:])  # 自动调整为列表末尾 []

1.2 stop(结束索引)

定义

:切片的结束位置(不包含该位置)

默认值

:当省略或为None时,默认为列表长度(正向步长)或-1(反向步长)

特点

同样支持正负索引

是"独占"边界,即不包含该位置元素

当step为负时,stop应小于start才有意义

# 正索引示例

print(nums[:7])    # 到索引7(不包括7) [0, 1, 2, 3, 4, 5, 6]

# 负索引示例

print(nums[:-3])   # 到倒数第3个(不包括) [0, 1, 2, 3, 4, 5, 6]

# 特殊示例

print(nums[3:3])   # 空切片 []

1.3 step(步长)

定义

:元素选取的间隔

默认值

:当省略或为None时,默认为1

特点

可以是正整数(从左向右)或负整数(从右向左)

不能为0,否则会引发ValueError

决定了切片的遍历方向

# 正向步长

print(nums[::2])   # 每隔一个取一个 [0, 2, 4, 6, 8]

# 反向步长

print(nums[::-1])  # 列表反转 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

# 带起止的反向步长

print(nums[8:2:-2]) # 从索引8到2,每隔一个反向取 [8, 6, 4]

2. 参数组合关系

3. 特殊边界情况

当参数超出列表边界时,Python会自动调整:

# start超出左边界

print(nums[-20:5])  # 等价于nums[0:5] [0, 1, 2, 3, 4]

# stop超出右边界

print(nums[3:20])   # 等价于nums[3:10] [3, 4, 5, 6, 7, 8, 9]

# 反向步长的边界调整

print(nums[20:3:-1]) # 等价于nums[9:3:-1] [9, 8, 7, 6, 5, 4]

4. 参数默认值总结

表1:切片参数默认值表

5. 练习

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 获取索引2到5的元素(不包括5)

slice1 = numbers[2:5]  # [2, 3, 4]

# 从开始到索引4

slice2 = numbers[:5]   # [0, 1, 2, 3, 4]

# 从索引5到末尾

slice3 = numbers[5:]   # [5, 6, 7, 8, 9]

# 获取整个列表的副本

slice4 = numbers[:]    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

6. 步长(step)的高级用法

步长参数允许我们跳过元素或反向获取列表:

# 每隔一个元素取一个

slice5 = numbers[::2]   # [0, 2, 4, 6, 8]

# 从索引1开始,每隔两个元素取一个

slice6 = numbers[1::3]  # [1, 4, 7]

# 反向列表

slice7 = numbers[::-1]  # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

# 从索引7反向到索引2(不包括2)

slice8 = numbers[7:2:-1] # [7, 6, 5, 4, 3]

7. 切片赋值技巧

切片不仅可以获取子列表,还可以用来修改列表:

# 替换切片范围内的元素

numbers[2:5] = [20, 30, 40]  # 现在numbers = [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]

# 删除切片范围内的元素

numbers[2:5] = []  # 删除元素,numbers = [0, 1, 5, 6, 7, 8, 9]

# 插入新元素(不删除任何元素)

numbers[3:3] = ['a', 'b', 'c']  # 在索引3处插入,numbers = [0, 1, 5, 'a', 'b', 'c', 6, 7, 8, 9]

8. 多维列表切片

对于嵌套列表(多维列表),切片操作同样适用:

matrix = [

  [1, 2, 3],

  [4, 5, 6],

  [7, 8, 9]

]

# 获取前两行的前两列

slice9 = [row[:2] for row in matrix[:2]]  # [[1, 2], [4, 5]]

# 获取对角线元素

diagonal = [matrix[i][i] for i in range(3)]  # [1, 5, 9]

9. 切片与性能

切片操作是浅拷贝(shallow copy),对于大型列表非常高效:

big_list = list(range(1000000))

# 以下操作非常快速,不会复制实际数据

first_part = big_list[:500000]

last_part = big_list[500000:]

10. 实用切片技巧

# 获取最后n个元素

n = 3

last_n = numbers[-n:]  # [7, 8, 9]

# 获取除最后n个外的所有元素

all_but_last_n = numbers[:-n]  # [0, 1, 2, 3, 4, 5, 6]

# 轮转列表(将前k个元素移到末尾)

k = 4

rotated = numbers[k:] + numbers[:k]  # [4, 5, 6, 7, 8, 9, 0, 1, 2, 3]

# 分组处理(每3个元素一组)

grouped = [numbers[i:i+3] for i in range(0, len(numbers), 3)]

# [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]

11. 切片边界情况处理

Python切片会自动处理越界情况,使代码更健壮:

# 开始索引小于0

numbers[-20:]  # 等同于numbers[0:]

# 结束索引大于列表长度

numbers[:20]   # 等同于numbers[:]

# 开始索引大于结束索引(正步长)

numbers[5:2]    # 返回[]

# 开始索引小于结束索引(负步长)

numbers[2:5:-1] # 返回[]

12. 实际应用示例

# 提取偶数索引元素

print(nums[::2])  # [0, 2, 4, 6, 8]

# 提取奇数索引元素

print(nums[1::2]) # [1, 3, 5, 7, 9]

# 反转字符串

s = "Python"

print(s[::-1])    # "nohtyP"

# 矩阵行列提取

matrix = [[1,2,3], [4,5,6], [7,8,9]]

print([row[1] for row in matrix])  # 提取第二列 [2, 5, 8]

13. 常见误区提醒

区间理解错误

# 错误认为nums[3:5]包含索引5

print(nums[3:5])  # 实际输出[3, 4],不包含5

步长方向错误

# start < stop但step为负

print(nums[2:5:-1])  # 返回空列表[]

浅拷贝问题

nested = [[1,2], [3,4]]

copy = nested[:]

copy[0][0] = 99

print(nested)  # [[99, 2], [3,4]] 原列表也被修改

切片操作是Python中处理序列数据的利器,合理使用可以让代码更简洁、更高效。掌握切片三参数的精确定义和相互关系,是高效使用Python切片的关键。

记住:切片的基本模式[start:stop:step],start决定起点(包含),stop决定终点(不包含),step决定方向和步幅。

更新日期:2025-05-04

交流讨论:欢迎在评论区留言!

重要提示:本文主要是记录自己的学习与实践过程,所提内容或者观点仅代表个人意见,只是我以为的,不代表完全正确,不喜请勿关注。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Oo9G5kzUP2YIkC8nSuBnSgKA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券