2

Python (これも numpy を使用) では、リストのリストのリストがあり、各リストの長さは異なります。

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

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

このデータ構造を長方形にしたい: つまり、すべてに対して一定である、すべての x、y に対して一定であるなどを保証しますlen(list[x])xlen(list[x][y])

(これはnumpyにデータ構造をインポートしたいからです)

そのようなことを行うためのさまざまな非pythonicな方法を考えることができます(構造を反復し、各レベルで最大長を記録し、2回目のパスと で値をパディングしますNoneが、もっと良い方法があるはずです.

(また、ソリューションが構造の次元に依存しないようにしたいと考えています。つまり、そのような構造のリストでも機能する必要があります...)

私が見逃しているこれを行う簡単な方法はありますか?

4

1 に答える 1

1

必要な寸法でを作成しndarray、リストを簡単に読み取ることができます。リストが不完全なので、ブロックIndexErrorで実行できる をキャッチする必要があります。try / exception

を使用すると、ソリューションをより多くの次元に簡単に拡張できます (以下の for ループに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')
于 2013-05-22T17:04:46.967 に答える