2014-12-31 2 views
1

이전 질문에서 저는 sqare 행렬로부터 모든 대각선을 얻는 방법을 발견했습니다.비 정방 행렬의 대각선 - 파이썬

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

나는 이미 대각선을 얻는 방법을 알고

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

이 내가 원하는 출력은 다음과 같습니다

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

, 나는이 행렬이 : 이것은 내 코드입니다 정방향 및 역방향.
문제는이 코드가 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

관련 문제