如何提取矩阵主对角线下方右上上升对角线元素并按格式输出?
解决矩阵主对角线下方元素按右上对角线排列的问题
首先得明确你提到的主对角线「PiTro」对应的位置——它其实是行索引i + 列索引j = 5的那条线:
- matrix[5][0] = 'P'、matrix[4][1] = 'i'、matrix[3][2] = 'T'、matrix[2][3] = 'r'、matrix[1][4] = 'o',刚好拼出「PiTro」。
你要提取的是这条主对角线下方的元素,也就是满足i + j > 5的元素,然后按右上方向的上升对角线(即i + j为固定值的一组元素)来排列,每组元素按行从高到低(列从低到高)拼接成字符串。
你原有代码的问题
你嵌套循环的索引计算逻辑有问题,比如当f=5、k=4时,k-f = -1,直接触发列索引越界;同时循环范围没有限制有效索引的边界,导致取到不存在的元素。
正确解决方案
我们可以按i + j的和来分组,从最小的6(主对角线和为5,下一组就是6)到最大的9(矩阵最大行索引5 + 最大列索引4),每组内收集有效元素并拼接:
matrix = [ ['a', 'p', 'p', 'l', 'e'], ['a', 'g', 'o', 'd', 'o'], ['n', 'n', 'e', 'r', 't'], ['g', 'a', 'T', 'A', 'C'], ['m', 'i', 'c', 's', 'r'], ['P', 'o', 'P', 'o', 'P'] ] result = [] # 遍历所有i+j >5的和值,从6到9 for s in range(6, 5 + 4 + 1): current_diagonal = [] # 从最大的行索引开始往下找,确保列索引j=s-i在有效范围内(0<=j<5) for i in range(min(5, s), max(-1, s - 4 - 1), -1): j = s - i if 0 <= j < 5: current_diagonal.append(matrix[i][j]) # 把当前对角线的元素拼接成字符串加入结果 if current_diagonal: result.append(''.join(current_diagonal)) print(result) # 输出: ['ocAt', 'PsC', 'or', 'P']
代码解释
- 外层循环:遍历
i+j的和s,从6到9(覆盖所有主对角线下方的元素组)。 - 内层循环:从最大的有效行索引开始递减,计算对应的列索引
j=s-i,只保留列索引在0-4之间的元素。 - 拼接字符串:把每组对角线的元素拼接成字符串,加入结果列表。
如果你喜欢更简洁的写法,也可以用列表推导式实现:
result = [ ''.join([matrix[i][s-i] for i in range(min(5, s), max(-1, s-4-1), -1) if 0 <= s-i <5]) for s in range(6, 10) ] # 过滤空字符串(这里实际不会产生空值,可省略) result = [item for item in result if item]
内容的提问来源于stack exchange,提问作者MM1
相关产品推荐
相关产品推荐

