MST

星途 面试题库

面试题:Python切片操作的边界条件 - 专家难度

在Python中,对多维数组(以二维列表为例 `matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]`)进行切片操作时,切片的边界条件会有哪些特殊情况需要考虑?如何通过切片操作获取主对角线元素 `[1, 5, 9]`,同时解释在这种多维切片场景下,起始、结束索引以及步长在不同维度上是如何根据边界条件进行设置和协同工作的。
10.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 切片边界条件特殊情况

    • 索引越界:如果使用超出列表长度的索引进行切片,Python不会报错,而是会根据情况返回空列表。例如,对于 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]matrix[3:] 会返回 [],因为索引3超出了外层列表的长度(长度为3,索引范围是0 - 2)。同样,对于内层列表,matrix[0][3:] 也会返回 [],因为内层列表 [1, 2, 3] 的索引3超出范围(长度为3,索引范围是0 - 2)。
    • 负数索引:负数索引从列表末尾开始计数。例如,matrix[-1] 表示取最后一个内层列表 [7, 8, 9]。在内层列表中同样适用,如 matrix[0][-1] 表示取 [1, 2, 3] 中的最后一个元素3。当负数索引与切片结合时,需要注意其实际对应的位置。比如 matrix[-2:][0],先取倒数第二个到最后的子列表,即 [[4, 5, 6], [7, 8, 9]],再取这个子列表的第一个元素 [4, 5, 6]
  2. 获取主对角线元素

    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    diagonal = [matrix[i][i] for i in range(len(matrix))]
    print(diagonal)
    

    在上述代码中,我们使用了列表推导式。通过 range(len(matrix)) 获取与矩阵行数(也是列数,因为是方阵)相等的索引序列。然后通过 matrix[i][i] 来获取主对角线元素,因为主对角线元素的行索引和列索引是相等的。

  3. 起始、结束索引以及步长在不同维度上的设置和协同工作

    • 外层列表(第一维度)
      • 起始索引:指定从哪个内层列表开始切片。例如 matrix[1:] 表示从索引为1的内层列表 [4, 5, 6] 开始取所有内层列表,即 [[4, 5, 6], [7, 8, 9]]
      • 结束索引:指定切片到哪个内层列表之前结束(不包含该内层列表)。例如 matrix[:2] 表示取索引为0和1的内层列表,即 [[1, 2, 3], [4, 5, 6]]
      • 步长:指定在取内层列表时的间隔。例如 matrix[::2] 表示从外层列表的起始位置开始,每隔一个内层列表取一个,即 [[1, 2, 3], [7, 8, 9]]
    • 内层列表(第二维度)
      • 起始索引:指定从内层列表的哪个元素开始切片。例如 matrix[0][1:] 表示取 matrix 中第一个内层列表 [1, 2, 3] 从索引为1的元素开始,即 [2, 3]
      • 结束索引:指定在内层列表中切片到哪个元素之前结束(不包含该元素)。例如 matrix[1][:2] 表示取 matrix 中第二个内层列表 [4, 5, 6] 从起始到索引为1的元素,即 [4, 5]
      • 步长:指定在内层列表中取元素的间隔。例如 matrix[2][::2] 表示取 matrix 中第三个内层列表 [7, 8, 9] 中每隔一个元素取一个,即 [7, 9]

    在多维切片场景下,不同维度的切片操作是独立进行的,但整体的切片结果是嵌套的。例如 matrix[1:3][0][1:],首先 matrix[1:3] 取到 [[4, 5, 6], [7, 8, 9]],然后 [0] 取这个结果的第一个内层列表 [4, 5, 6],最后 [1:] 取这个内层列表从索引1开始的元素 [5, 6]