面试题答案
一键面试-
切片边界条件特殊情况:
- 索引越界:如果使用超出列表长度的索引进行切片,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]
。
- 索引越界:如果使用超出列表长度的索引进行切片,Python不会报错,而是会根据情况返回空列表。例如,对于
-
获取主对角线元素:
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]
来获取主对角线元素,因为主对角线元素的行索引和列索引是相等的。 -
起始、结束索引以及步长在不同维度上的设置和协同工作:
- 外层列表(第一维度):
- 起始索引:指定从哪个内层列表开始切片。例如
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]
。 - 外层列表(第一维度):