切片
1. 为何需要切片
- 取 list 或 tuple 的部分元素非常常见;用下标逐个取或循环取都很繁琐。
- Python 提供**切片(Slice)**操作符,用一行代替多行循环。
对比:取前 N 个元素
- 笨办法:
[L[0], L[1], L[2]],取前 N 个难以扩展。 - 循环:
for i in range(n): r.append(L[i]),代码多。 - 切片:
L[:3]一行完成。
2. 基本语法
- 形式:
L[start:end],从索引 start 取到 end,不包括 end(左闭右开)。 - 即取索引 start, start+1, ..., end-1。
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
L[0:3] # ['Michael', 'Sarah', 'Tracy'],索引 0,1,2
L[:3] # 同上,第一个索引为 0 可省略
L[1:3] # ['Sarah', 'Tracy'],从索引 1 取 2 个
记忆:L[i:j] = 索引 i 到 j-1,共 j−i 个元素。
3. 倒数切片(负索引)
- 倒数第一个索引为 -1,倒数第二个为 -2,以此类推。
L[-2:]:从倒数第二个取到最后一个(含)。L[-2:-1]:倒数第二个到倒数第一个之前(不含最后一个),即只取倒数第二个。
L[-2:] # ['Bob', 'Jack'],倒数 2 个
L[-2:-1] # ['Bob'],仅倒数第 2 个
4. 步长:第三参数
- 形式:
L[start:end:step],每 step 个取一个;省略 start/end 表示从头/到尾。 L[:10:2]:前 10 个里每 2 个取 1 个 → 0,2,4,6,8。L[::5]:全部每 5 个取 1 个。L[:]:原样复制整个 list(start=0, end=末尾, step=1)。
L = list(range(100))
L[:10] # 前 10 个:[0,1,...,9]
L[-10:] # 后 10 个:[90,...,99]
L[10:20] # 索引 10–19:[10,...,19]
L[:10:2] # 前 10 个,步长 2:[0,2,4,6,8]
L[::5] # 全部,步长 5:[0,5,10,...]
L[:] # 复制整个 list
5. tuple 与字符串的切片
- tuple:也可用切片,结果仍是 tuple。如
(0,1,2,3,4,5)[:3]→(0, 1, 2)。 - 字符串:可看成“字符的 list”,结果仍是字符串。Python 没有单独的 substring 函数,用切片即可。
(0, 1, 2, 3, 4, 5)[:3] # (0, 1, 2)
'ABCDEFG'[:3] # 'ABC'
'ABCDEFG'[::2] # 'ACEG'