Python 将不完整的嵌套列表放入矩形数组中

Python 将不完整的嵌套列表放入矩形数组中,python,list,numpy,nested-lists,multidimensional-array,Python,List,Numpy,Nested Lists,Multidimensional Array,在Python中(也使用numpy),我有一个列表列表,每个列表的长度不同 [ [ ["header1","header2"], ["---"], [], ["item1","value1"] ], [ ["header1","header2","header3"], ["item2","value2"], ["item3","value3","

在Python中(也使用numpy),我有一个列表列表,每个列表的长度不同

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

    [
         ["header1","header2","header3"],
         ["item2","value2"],
         ["item3","value3","value4","value5"]
    ]
]
我想将此数据结构设置为矩形:即保证
len(list[x])
对于所有
x
len(list[x][y])
对于所有x、y等都是常量

(这是因为我想将数据结构导入numpy)

我可以想出各种非音速的方法来做这样的事情(在结构上迭代,在每个级别上记录最大长度,使用
的第二遍和pad值,但必须有更好的方法

(我还希望解决方案不依赖于结构的维度;即,它也应适用于此类结构的列表……)


有没有一种简单的方法我不知道?

您可以创建一个具有所需维度的
ndarray
,并随时读取列表。由于列表不完整,您必须捕获
索引器,这可以在
try/exception
块中完成

使用
numpy.ndenumerate
可以轻松地将解决方案扩展到更多维度(在下面的for循环中添加更多索引
i、j、k、l、m、n、
):


这里有三个级别的列表-它需要在什么级别上是矩形的?(或者,我想,三个级别都需要是立方的)一旦数据在NumPy中,你将如何处理它?Lattyware:所有这些;我最终想要的数据结构应该可以描述为x-x-y-x-z长方体。KarlKnechtel:使用NumPy的多维切片,根据诸如“与字符串在同一列中”之类的内容识别我真正感兴趣的数据与字符串“标题行”位于同一行中"。您是如何获得这些数据的?它是从您的其他代码中产生的,还是从csv/json/xml或其他形式的结构化数据中读取的?作为一个稍微的要点,我真的很好奇您为什么要使用Numpy来实现这一点。在这种情况下,Numpy提供了正常列表所不提供的什么?更广泛地说,尽管numpy完全能够存储各种奇怪的数据类型,我不知道为什么有人会将它用于非简单类型(这是真正的好奇!)。
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')