2013-05-22 2 views
2

파이썬 (numpy도 사용)에는 각리스트의 길이가 다른리스트리스트가 있습니다.직사각형의 ndarray에 불완전한 중첩리스트 넣기

[ 
    [ 
     ["header1","header2"], 
     ["---"], 
     [], 
     ["item1","value1"] 
    ], 

    [ 
     ["header1","header2","header3"], 
     ["item2","value2"], 
     ["item3","value3","value4","value5"] 
    ] 
] 

나는이 데이터 구조 직사각형 만들고 싶어 : len(list[x]) 모든 x에 대한 일정을 보장 즉, len(list[x][y]) 모든 X, Y에 대한 일정 등

(나는를 가져올 때문이다 데이터 구조를 numpy로 변환)

그런 일을하는 다양한 방법을 생각해 볼 수 있습니다. (구조를 반복하고, 각 레벨에서 최대 길이를 기록하고, 두 번째 패스와 패드 값을 None으로 설정해야하지만 더 좋은 방법이 있어야합니다.

(솔루션의 구조에 의존하지 않아도됩니다. 즉, 구조체 목록에서도 작동해야합니다 ...)

누락 된 간단한 방법이 있습니까?

+1

: numpy.ndenumerate를 사용

솔루션 (아래 for 루프에서 더 많은 인덱스 i,j,k,l,m,n,... 추가) 이상의 차원에 쉽게 확장 될 수 있습니다 에? (또는 입방체, 나는이 세 가지 모두에 대해). –

+0

NumPy에 들어가면 데이터로 무엇을 할 것입니까? –

+0

Lattyware : 모두들; 결국 원하는 데이터 구조는 x-by-y-by-z 입방체로 설명 할 수 있어야합니다. KarlKnechtel : Numpy의 다차원 슬라이싱을 사용하여 "Header Row"문자열과 같은 행에있는 "My Data"문자열과 동일한 열에있는 "My Data"와 같은 항목을 기반으로 실제로 관심있는 데이터를 식별하십시오. –

답변

1

원하는 치수로 ndarray을 작성하면 쉽게 목록을 읽을 수 있습니다. 귀하의 목록이 불완전하므로 try/exception 블록에서 수행 할 수있는 IndexError에 잡아야합니다. - 어떤 수준이 사각형 일 필요 않습니다 현재 목록의 세 가지 수준이

import numpy as np 
test = [ [ ["header1","header2"], 
      ["---"], 
      [], 
      ["item1","value1"] ], 
     [ ["header1","header2","header3"], 
      ["item2","value2"], 
      ["item3","value3","value4","value5"] ] ] 


collector = np.empty((2,4,4),dtype='|S20') 

for (i,j,k), v in np.ndenumerate(collector): 
    try: 
     collector[i,j,k] = test[i][j][k] 
    except IndexError: 
     collector[i,j,k] = '' 


print collector 
#array([[['header1', 'header2', '', ''], 
#  ['---', '', '', ''], 
#  ['', '', '', ''], 
#  ['item1', 'value1', '', '']], 
#  [['header1', 'header2', 'header3', ''], 
#  ['item2', 'value2', '', ''], 
#  ['item3', 'value3', 'value4', 'value5'], 
#  ['', '', '', '']]], dtype='|S10') 
관련 문제