2013-12-20 85 views
1

試圖獲得一個NXN矩陣的所有對角線元素,而無需使用numpy的使用numpy的,一個NXN矩陣的所有對角線元素沒有蟒蛇

這是Get diagonal without using numpy in Python

不同,請不要標記爲重複。

這是我的代碼片斷使用兩次迭代,它將打印從(0,0)到(n,n)的所有對角線元素。有人可以幫助我改進我的迭代過程或任何遞歸方式來做到這一點。

#!/usr/bin/python 

matrix = [[1,2,3,4], 
      [2,3,4,5], 
      [3,4,5,6], 
      [4,5,6,7]] 

def get_matrix_diagonal(m): 
    col = len(m) 
    result = list() 
    row = 0 
    for c in range(col): 
     position = list() 
     position.append([row,c]) 
     if c > 0: 
      i = c 
      while i > 0: 
       x = i - 1 
       y = c - i + 1 
       position.append([y,x]) 
       i -= 1 
     result.append(position) 
    row = row + 1 
    cc = c 
    for i in range(row,col): 
     position = list() 
     y = i 
     x = c 
     position.append([y,x]) 
     j = x - y 
     while j > 0: 
      y = c - j + 1 
      x = cc - y + 1 
      position.append([y,x]) 
      j -= 1 
     cc += 1 
     result.append(position) 
    return result 

for ls in get_matrix_diagonal(matrix): 
    for co in ls: 
     x,y = co[0],co[1], 
     print matrix[x][y], 
    print 

輸出:

1 
2 2 
3 3 3 
4 4 4 4 
5 5 5 
6 6 
7 
+0

我沒有近距離投,但實際上這將是更好的問在codereview上,我認爲 –

+0

好的,下次再說,謝謝。 –

回答

4
>>> matrix = [[1,2,3,4], 
...   [2,3,4,5], 
...   [3,4,5,6], 
...   [4,5,6,7]] 
>>> N = 4 
>>> [[matrix[y-x][x] for x in range(N) if 0<=y-x<N] for y in range(2*N-1)] 
[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5], [6, 6], [7]] 
+0

哇,這是甜蜜的... @gnibbler你可以幫助我的遞歸或是否有可能做遞歸? –

+0

爲了解決遞歸問題,你需要找到一種方法來使用MxM矩陣將NxN矩陣分解成更小的問題,所以M

+0

好吧我會嘗試一下,但我不確定基本情況。 –

1

這裏的遞歸方法假設你的矩陣是方陣:

def diagonals(m): 
    if len(m) == 1: return m 
    d = [[]] + diagonals([r[1:] for r in m[:-1]]) + [[]] 
    r = [r[0] for r in m] + m[-1][1:] 
    return [[r] + d for r, d in zip(r,d)] 
+0

真棒,非常感謝。它的工作原理,但我需要閱讀理解:) –

+1

基本上,每個遞歸刪除最左邊的列和最底部的行。 – Hyperboreus