2013-05-22 1 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]) постоянна для всех х, у и т.д.

(Это потому, что я хочу, чтобы импортировать структура данных в numpy)

Я могу придумать различные непитонические способы совершения такой вещи (перебирать структуру, записывать максимальную длину на каждом уровне, иметь второй проход и значения пэда с None, но должен быть лучший способ.

(Я также хотел бы, чтобы решение не зависело от размерности структуры; то есть он должен также работать над списками таких структур ...)

Есть ли простой способ сделать это, что мне не хватает?

+1

У вас есть три уровня списков здесь - то, что уровни это нужно, чтобы быть прямоугольным на? (Или кубический, я думаю, для всех трех). –

+0

Что вы собираетесь делать с данными, когда они находятся в NumPy? –

+0

Lattyware: все они; структура данных, которую я хочу в конце, должна описываться как кубик x-by-y-by-z. KarlKnechtel: Используя многомерный срез Numpy, определите те данные, которые меня действительно интересуют, на основе таких вещей, как «в том же столбце, что и строка« Мои данные »в той же строке, что и строка« Header Row ». –

ответ

1

Вы можете создать ndarray с нужными размерами и легко прочитать список. Поскольку ваш список неполный, вы должны поймать IndexError, что можно сделать в блоке try/exception.

Использование numpy.ndenumerate позволяет решение легко расширяемым больше размеров (добавление нескольких индексов i,j,k,l,m,n,... в цикл ниже):

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

 Смежные вопросы

  • Нет связанных вопросов^_^