Skip to content

切片

切片操作是 Python 中一种强大的机制,可以用于从序列类型(如列表、元组、字符串)中提取子序列。它提供了一种简洁高效的方式来访问和操作序列中的元素。

切片的基本语法

切片操作的基本语法如下:

python
sequence[start:end:step]
  • sequence: 要进行切片的序列,可以是列表、元组、字符串等。
  • start: 切片的起始索引,默认为 0,表示从序列的开头开始切片。
  • end: 切片的结束索引,不包含该索引处的元素,默认为序列的长度,表示切片到序列的结尾。
  • step: 切片的步长,默认为 1,表示每个元素都包含在切片中。如果为负数,则表示从右到左切片。

切片的操作示例

获取列表的前三个元素

python
my_list = [1, 2, 3, 4, 5]
first_three = my_list[:3]  # 获取从索引 0 到 3(不包含 3)的元素
print(first_three)         # 输出:[1, 2, 3]

获取列表中从索引 2 到 4 的元素

python
my_list = [1, 2, 3, 4, 5]
middle_elements = my_list[2:5]  # 获取从索引 2 到 5(不包含 5)的元素
print(middle_elements)          # 输出:[3, 4, 5]

获取列表中所有偶数索引处的元素

python
my_list = [1, 2, 3, 4, 5]
even_index_elements = my_list[::2]  # 步长为 2,从索引 0 开始获取元素
print(even_index_elements)          # 输出:[1, 3, 5]

反转列表

python
my_list = [1, 2, 3, 4, 5]
reversed_list = my_list[::-1]  # 步长为 -1,从右到左获取元素
print(reversed_list)           # 输出:[5, 4, 3, 2, 1]

获取元组的前三个元素

python
my_tuple = (10, 20, 30, 40, 50)

middle_elements = my_tuple[:3]
print(middle_elements)  # 输出: (10, 20, 30)

获取元组中从索引 2 到 4 的元素

python
my_tuple = (10, 20, 30, 40, 50)

middle_elements = my_tuple[2:4]
print(middle_elements)  # 输出: (30, 40)

获取元组中所有偶数索引处的元素

python
my_tuple = (10, 20, 30, 40, 50)

even_index_elements = my_tuple[::2]
print(even_index_elements)  # 输出: (10, 30, 50)

反转元组

python
my_tuple = (10, 20, 30, 40, 50)

reversed_tuple = my_tuple[::-1]
print(reversed_tuple)  # 输出: (50, 40, 30, 20, 10)

备注:如你所见,元组的切片操作与列表的切片操作语法完全相同。虽然元组是不可变的,但切片操作只是获取子序列,并不修改原元组,因此是允许的。

从字符串中提取子字符串

python
my_string = "Hello, world!"
substring = my_string[7:12]  # 从索引 7 到 12(不包含 12)的字符
print(substring)             # 输出:world

切片的修改操作

切片可以用于获取列表、元组和字符串的子序列,但只有列表可以被切片赋值修改。元组和字符串是不可变的,无法直接通过切片修改。

切片修改列表

python
my_list = [1, 2, 3, 4, 5]
my_list[1:3] = [10, 20]
print(my_list) # 输出:[1, 10, 20, 4, 5]

如果修改元组或者字符串,会引发错误:TypeError

python
my_tuple = (1, 2, 3, 4, 5)
my_tuple[1:3] = [10, 20] # 会引发 TypeError 错误

my_string = "hello"
my_string[1:3] = "ab" # 会引发 TypeError 错误

如果您需要修改元组或字符串,可以先将它们转换为列表,修改后再转换回原类型。

切片的删除操作

切片的删除操作和修改一样,只针对列表生效,对不可变的元组和字符串会报错。

python
my_list = [1, 2, 3, 4, 5]
del my_list[1:3]
print(my_list)  # 输出: [1, 4, 5]

切片的复制操作

切片可以用来复制列表、元组和字符串。通过使用 [:] 切片可以创建包含原对象所有元素的副本,修改新对象不会影响原对象。

  • 使用 [:] 切片复制列表或元组,实际上是创建了一个新的对象,包含原对象所有元素的副本。修改新对象不会影响原对象。
  • 字符串是不可变的,所以即使使用 [:] 切片复制,新字符串也会是原字符串的副本,修改新字符串不会影响原字符串。

复制列表

使用切片可以创建一个新的列表,包含原列表中所有元素的副本。

python
my_list = [1, 2, 3, 4, 5]
new_list = my_list[:]  # 使用 `[:]` 切片复制整个列表
print(new_list)        # 输出: [1, 2, 3, 4, 5]

复制元组

与列表类似,使用切片可以创建一个新的元组,包含原元组中所有元素的副本。

python
my_tuple = (1, 2, 3, 4, 5)
new_tuple = my_tuple[:]  # 使用 `[:]` 切片复制整个元组
print(new_tuple)         # 输出: (1, 2, 3, 4, 5)

复制字符串

python
my_string = "hello"
new_string = my_string[:] # 使用 `[:]` 切片复制整个字符串
print(new_string)         # 输出: hello

切片操作的注意事项

  • 索引越界: 如果切片操作的索引超出序列的范围,会引发 IndexError 错误。
  • 步长: 步长可以是正数、负数或 0。当步长为 0 时,切片为空序列。
  • 不可变序列: 虽然可以使用切片操作获取不可变序列的子序列,但无法修改不可变序列的元素。

切片的扩展操作

  • 多个切片: 可以对序列进行多个切片操作,例如 my_list[1:3][1] 等价于 my_list[2]
  • 负数索引: 可以对切片操作使用负数索引,例如 my_list[-3:-1] 表示从倒数第三个元素到倒数第一个元素(不包含最后一个元素)的子序列。

总结

切片操作是 Python 中一个强大的工具,它可以方便地操作序列数据。掌握切片操作可以使代码更简洁、高效,并能更好地处理序列数据。

Released under the MIT License.