跳到主要内容

切片

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'

小结

写法含义
L[i:j]索引 i 到 j-1(左闭右开)
L[:j]从开头到 j-1
L[i:]从 i 到末尾
L[-k:]倒数 k 个
L[i:j:k]从 i 到 j-1,步长 k
L[::k]整个序列,步长 k
L[:]复制整个 list
  • 左闭右开[start:end] 不包含 end。
  • 倒数:-1 是最后一个;L[-2:] 含最后一个,L[-2:-1] 不含。
  • 有了切片,很多循环可省略,一行完成多行逻辑。

练习:用切片实现 trim(s),去除字符串首尾空格,不调用 str.strip()