2012-04-19 2 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])] 

에게 비 재귀 버전을 시도

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

이 표준 아무것도 보지 않음이 나의 시도 -이 * 인수 및 위해 뭔가를 추가 할 수 있습니다 * * 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)'에 실패합니다. –