2014-04-14 2 views
4

이것은 내 첫 번째 게시물이며, 나는이 멋진 사이트입니다.중첩 목록의 요소를 대각선으로 표시

난 대각선으로 3 × 3 배열의 모든 요소를 ​​나열하고 싶습니다 :

L = [ [1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9] ] 

예상 출력 : 또한

[[7], [4, 8], [1, 5, 9], [2, 6], [3]] 

, 어떻게 내가 어떤 N의 X의 N 배열에 일반화 것인가?

편집 : 이전에 물어 봤지만 아직 그 문제에 대해 numpy 또는 라이브러리를 가져 오지 않고 방법을 찾고 있습니다.

Edit2가이 : 내 친구들 중 하나는이 솔루션을 제공, 내가 그것을 좋아하는 대부분의 :

당신이 왼쪽 하단에서 시작하여 대각선을 찾는 때문에, 당신은 광장의 오른쪽 상단에서 시작하여이 작업을 수행 할 수 있으며, 결국 당신의 솔루션을 되돌릴 수 있습니다. 내 접근 방식은 먼저 L의 각 행을 뒤집은 다음 각 요소를 해당 대각선 목록에 추가했습니다. 여기서 통찰력은 최종 목록의 첫 번째 하위 목록이 아니라 인덱스 K에서 시작하는 각 행 K에 요소를 추가하기 시작한다는 것입니다. 예를 들어 행 [4,5,6]을 행 [6,5, 4], 대각선으로 정렬 된 목록의 두 번째 하위 목록 (이 두 번째 행)에 6을 추가 한 다음 세 번째 하위 목록에 5를 추가 한 다음 네 번째 하위 목록에 4를 추가합니다. 그러나 대각선 목록에서 현재 네 번째 하위 목록이없는 경우 네 번째 빈 목록을 추가 한 다음 4로 채 웁니다.

설명이 너무 명확하지 않을 수 있습니다. 내가 가진 코드. 단지 파이썬 (NO NumPy와) 사용

def diagonal(l): 

    L = l[:] 
    return_list = [[] for i in range(len(L))] 

    for line in range(len(L)): 
     L[line].reverse() 
     i = line 

     for elem in L[line]: 
      if i >= len(return_list): 
       return_list.append([]) 

      return_list[i].append(elem) 
      i += 1 

    return_list.reverse() 
    return return_list 
+0

난 numpy를 사용하지 않는 동안 프로그램을 위해 이것을하는 방법을 만들었습니다. 나는 그것을 http://stackoverflow.com/questions/6313308/get-all-the-diagonals-in-a-matrix-list-of-lists-in-python에 추가 할 것이다 – flakes

+0

좋아, 나는 그것을 추가했다. – flakes

+1

@Calpratt 감사합니다! 나는 그것을 이해하기 위해 당신의 솔루션을 3 번 읽어야했지만 마침내 그것을 얻었습니다; – Moe

답변

5

: 더 나은, Nemo's transformation를 사용

import itertools as IT 

L = [ [1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9] ] 
N = len(L) 
d = dict() 
for i,j in IT.product(range(N), repeat=2): 
    d.setdefault(j-i, []).append((i,j)) 

print([[L[i][j] for i,j in d[k]] for k in range(-N+1, N)])  
# [[7], [4, 8], [1, 5, 9], [2, 6], [3]] 

또는은 (h x w 모양의 행렬에 일반화 :

L = [ [1, 2, 3,], 
     [4, 5, 6,], 
     [7, 8, 9,], ] 

h, w = len(L), len(L[0]) 

print([[L[h-1-q][p-q] 
     for q in range(min(p, h-1), max(0, p-w+1)-1, -1)] 
     for p in range(h+w-1)])        
# [[7], [4, 8], [1, 5, 9], [2, 6], [3]] 

우리 이 코드를 넣을 수도 있습니다. 더 쉬운 사용을위한 함수 :

def diagonals(L): 
    """ 
    https://stackoverflow.com/a/31373955/190597 (unutbu) 
    >>> L = array([[ 0, 1, 2], 
        [ 3, 4, 5], 
        [ 6, 7, 8], 
        [ 9, 10, 11]]) 

    >>> diagonals(L) 
    [[9], [6, 10], [3, 7, 11], [0, 4, 8], [1, 5], [2]] 
    """ 
    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)] 


def antidiagonals(L): 
    """ 
    >>> L = array([[ 0, 1, 2], 
        [ 3, 4, 5], 
        [ 6, 7, 8], 
        [ 9, 10, 11]]) 

    >>> antidiagonals(L) 
    [[0], [3, 1], [6, 4, 2], [9, 7, 5], [10, 8], [11]] 
    """ 
    h, w = len(L), len(L[0]) 
    return [[L[p - q][q] 
      for q in range(max(p-h+1,0), min(p+1, w))] 
      for p in range(h + w - 1)] 
관련 문제