2011-08-12 2 views
1

Je souhaite créer un tableau multidimensionnel et l'initialiser avec des copies d'un objet mutable . Voilà ce que j'ai jusqu'à présent:Meilleure façon d'initialiser un tableau multidimensionnel avec un objet mutable

import copy 

def create_array(dimensions): 
    dimensions = copy.deepcopy(dimensions) 
    dimensions.reverse() 
    a = [0] * dimensions[0] 
    del dimensions[0] 
    for d in dimensions: 
     a = [copy.deepcopy(a) for _ in range(d)] 
    return a 

def create_array_mutable(dimensions, obj): 
    a = create_array(dimensions) 
    def set(x): 
     if isinstance(x[0], list): 
      for e in x: 
       set(e) 
     else: 
      for i in range(len(x)): 
       x[i] = copy.deepcopy(obj) 
    set(a) 
    return a 

Je me demande s'il y a une meilleure façon de le faire (sans les copies et la récursion)?

+4

Si vous pouvez utiliser numpy alors la première réponse ici semble être proche de ce que vous cherchez - http://stackoverflow.com/questions/4877624/numpy-array-of-objects (bien que cela appelle le constructeur plutôt que de copier ...) –

Répondre

2

Que diriez-vous:

import copy 

def create_array_mutable(dims, obj): 
    if len(dims) == 0: 
    return copy.deepcopy(obj) 
    else: 
    return [create_array_mutable(dims[1:], obj) for i in xrange(dims[0])] 

class C(object): pass 

print create_array_mutable((2,3,4), C()) 

Cela crée un tableau 2x3x4 des instances uniques de C.

La solution est toujours récursive, mais je pense que la récursivité est un bon ajustement pour ce problème.

Questions connexes