2014-12-31 84 views
1

在前面的問題中,我找到了一種方法從一個sqare矩陣中獲得所有對角線。這是我的代碼:在非方形矩陣中的對角線-python

diags=[[s[y-x][x] for x in range(n) if 0<=y-x<n] for y in range(2*n-1)] 

例如,我有這樣的矩陣:

m=[[V,A,T],[D,I,S],[O,I,M],[F,U,A]] 

這是輸出我想:

[[V],[D,A],[O,I,T],[F,I,S],[U,M],[A]] 

我已經知道如何獲得對角線的正向和反向。
問題是這個代碼只適用於sqare矩陣,但現在我需要找到一個非方形矩陣中的所有對角線。
我認爲這個問題是與這部分代碼:

for y in range(2*n-1) 

我的問題是:有沒有一種方法來定義對角線的非方陣?如果有的話,有人會幫助我嗎?
我發現什麼都不會幫助我解決其他問題。
P.S:我不允許使用numpy。
任何形式的幫助,提示,建議將不勝感激。

+1

請儘量包括樣本輸入和預期的輸出。 –

回答

2

這是您的代碼的對於正方形矩陣的直接概括。而不是2*n-1 = n+n-1,您需要在外部列表中需要m+n-1,並且在內部列表中,您需要檢查行和列方向的邊界,因爲它們會不同。

mat = [['V', 'A', 'T'], ['D', 'I', 'S'], ['O', 'I', 'M'], ['F', 'U', 'A']] 
rows = len(mat) 
cols = len(mat[0]) 
diags = [[mat[sum_-k][k] 
      for k in range(sum_ + 1) 
      if (sum_ - k) < rows and k < cols] 
     for sum_ in range(rows + cols - 1)] 
print(diags) 

結果:

[ 
    ['V'], 
    ['D', 'A'], 
    ['O', 'I', 'T'], 
    ['F', 'I', 'S'], 
    ['U', 'M'], 
    ['A'] 
] 
+0

非常感謝!這正是我需要的。 – Nessa

0

下面的代碼(在C++)將打印對角線:

#include <iostream> 

int main() { 
    char matrix[4][3] = { {'V', 'A', 'T'}, 
          {'D', 'I', 'S'}, 
          {'O', 'I', 'M'}, 
          {'F', 'U', 'A'}}; 

    int m = 4, n = 3; 

    for (int i = 0; i < m + n - 1; i++) {  //m+n-1 = 4+3-1 = 6 diagonals 
     int z1 = i < n ? 0 : i - n + 1; 
     int z2 = i < m ? 0 : i - m + 1; 

     for (int j = i - z2; j >= z1; j--) 
       std::cout << matrix[j][i - j] << " "; 

     std::cout << endl; 
    } 

    return 0; 
} 

輸出:

V 
D A 
O I T 
F I S 
U M 
A 
+0

謝謝你的幫助! – Nessa