2013-05-22 49 views
2

在Python中(也使用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)

我可以想到做這樣的事情的各種unpythonic方法(遍歷結構,記錄每個級別的最大長度,第二遍和填充值與None,但必須有更好的方法。

(我也希望解決方案不要依賴於結構的維度;即它也應該在這樣的結構列表上工作......)

有沒有一個簡單的方法來做到這一點,我失蹤了?

+1

你有三個層次這裏列出的 - 它需要什麼級別爲矩形上? (或者立方體,我猜,所有三個)。 –

+0

一旦數據在NumPy中,你將如何處理這些數據? –

+0

Lattyware:所有這些;我最終想要的數據結構應該可以描述爲一個x-by-y-by-z長方體。 KarlKnechtel:使用Numpy的多維切片,基於諸如「與字符串」我的數據「在與字符串」標題行「相同的行中的相同列中的內容來識別我實際感興趣的數據。 –

回答

1

您可以創建一個具有所需尺寸的ndarray並隨時讀取您的列表。由於您的列表不完整,您必須抓住IndexError,這可以在try/exception塊中完成。

使用numpy.ndenumerate使該解決方案是很容易擴展到多個維度(增加更多的指標i,j,k,l,m,n,...在for循環下):

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')