对角线上的python打印2d数组

时间:2015-07-12 23:57:14

标签: python matrix

我正在尝试打印2D阵列的对角线,从左下角开始向右上角移动。我已经设法打印矩阵的前半部分但是当我必须打印它的第二部分时我卡住了,我希望有人能给我一个如何继续的线索。这就是我所拥有的:

matrix = [ ["A", "B", "C", "D"], ["E","F","G","H"], ["I","J","K","L"], ["M","N","O","P"], ["Q", "R", "S","T"]]

和将对角线打印到一点的部分功能:

def diagonal_matrix_print(input_matrix):
    width = len(input_matrix[0])
    height = len(input_matrix)
    start_row = height - 1
    first_row = 0 
    for start_row in reversed( range (0, height)):
        i = start_row
        for column in range (0, width):
            if i == height:
                start_row = start_row - 1
                break
            print input_matrix[i][column]
            i = i + 1
        print

我面临的问题是打印从矩阵的后半部分开始的对角线 - B G L,C M,D

我尝试使用另外2个for循环,如:

for row in range ( 0, height -1):
    i = row
    for start_column in range (1, width):
        print input_matrix[i][start_column]
        i = i + 1

但是当行值更改为1时,不再打印对角线了...请帮助

1 个答案:

答案 0 :(得分:0)

假设我们有列表>>> L = [[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]])

diagonals

我们想要一个函数>>> diagonals(L) [[9], [6, 10], [3, 7, 11], [0, 4, 8], [1, 5], [2]] ,以便

L

我们可以考虑(x, y)中关于2个不同坐标的项目 系统。 (x, y)对应的常用L[x][y]坐标系 值为(p, q)的位置。

然后还有p坐标系,其中pth代表。{1}} p=0对角线,q左下角的诊断qth 表示pth诊断中的q=0项,其中(p, q) = (0,0)左侧开始 边缘。因此,L[3][0] = 9对应于值为h,w的位置 在上面的例子中。

L分别等于p的高度和宽度。 然后0的范围从h + w - 1(p, q)

我们需要一个从(x, y)坐标转换为x坐标的公式。

  • p随着x的增加呈线性下降。
  • q随着(p, q) = (0, 0)的增加呈线性增长。
  • x时,h等于x = h - p + q

因此:y

  • p不随q更改(如果y已修复)。
  • q随着(p, q) = (0, 0)的增加呈线性增长。
  • y时,q等于y = q

因此,x

现在,y(0 <= x = h - p + q < h) and (0 <= y = q < w) 的有效值范围要求:

(p - h + 1 <= q < p + 1) and (0 <= q < w)

相当于

max(p - h + 1, 0) <= q < min(p + 1, w)

相当于

L

因此,我们可以使用

遍历for p in range(h + w - 1): for q in range(max(p-h+1, 0), min(p+1, w)) L[h - p + q - 1][q] 的项目
def diagonals(L):
    h, w = len(L), len(L[0])
    return [[L[h - p + q - 1][q]
             for q in range(max(p-h+1, 0), min(p+1, w))]
            for p in range(h + w - 1) ]


matrix = [ ["A", "B", "C", "D"], ["E","F","G","H"], ["I","J","K","L"], ["M","N","O","P"], ["Q", "R", "S","T"]]

for diag in diagonals(matrix):
    print(diag)
['Q']
['M', 'R']
['I', 'N', 'S']
['E', 'J', 'O', 'T']
['A', 'F', 'K', 'P']
['B', 'G', 'L']
['C', 'H']
['D']

产量

<%= stylesheet_link_tag 'app', media: 'all' %>
<%= javascript_include_tag 'app' %>