2012-04-19 4 views
1

numpy配列初期化メソッドの働きと同様に、任意のサイズのリストをオブジェクトで初期化する関数を実装しようとしています。任意形状のネストされたリストを初期化する

def fill(shape, object): 

私はこれに対して私の頭を叩いてきたが、任意の長さの次元のためにこれを行う方法を考えることはできません。私はそれが何らかの再帰を必要とするだろうと推測しています。

これは、望ましい動作の例です。簡単にするために、オブジェクトがちょうど浮動小数点数0ですが、私はこれがどのクラスで作業する必要があります:

> fill((2, 3, 4), 0.) 
[ 
[[ 0., 0., 0., 0.], 
    [ 0., 0., 0., 0.], 
    [ 0., 0., 0., 0.]] 
, 
[[ 0., 0., 0., 0.], 
    [ 0., 0., 0., 0.], 
    [ 0., 0., 0., 0.]] 
] 

答えて

5

次の再帰的な実装

def fill(shape,value): 
    if not shape: return value 
    return [fill(shape[1:],value) for i in range(shape[0])] 

非再帰バージョン

をお試しください210
import copy 
def fill(shape,value): 
    result=value 
    for i in reversed(shape): 
     result=[copy.deepcopy(result) for j in range(i)] 
    return result 
-1

は、このための標準的な何かを見ていない、これは私のattempt-は*引数とするために何かを追加することができています* * kwargsからあまりに

In [1]: def fill(dimensions,cls): 
    ...:  size_list=[cls()]*dimensions[-1] 
    ...:  for dimension in dimensions[:0:-1]: 
    ...:   size_list=[size_list]*dimension 
    ...:  return size_list 
    ...: 

In [2]: print fill((2,3,4),float) 
[[[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]]] 
+4

整数nでリストを掛けてもn個の新しいリストは作成されません。同じリストに対して複数の参照のみを行います。 – DSM

+0

もちろん、私の間違い – GP89

+0

また、それは3次元のためにのみ動作します。 'fill((2,3,4,5)、float)'に失敗します。 –

関連する問題