2010-12-28 11 views
14

¿Hay alguna manera de hacer una lista de crecimiento automático en Python? Lo que quiero decir es hacer una lista que crezca cuando se haga referencia a un índice que aún no existe. Básicamente, el comportamiento de las matrices de Ruby.Listas de crecimiento automático en Python

¡Gracias de antemano!

+0

Um, sólo se describe la forma en que funcionan las listas. ¿Qué estás intentando que no está funcionando? – Falmarri

+0

Lo que quiero decir es que si el contexto está fuera de rango, se generará un error. Quiero que la lista crezca hasta un tamaño en el que se acomode el índice; en Ruby esto llenará todos los puntos intermedios con nulos. – Anonymous

+1

¿Qué desea que sean los contenidos del índice que aún no existe cuando se hace referencia por primera vez (y todos los elementos anteriores)? ¿Debería ser 'None' u otro valor predeterminado? –

Respuesta

31

Claro que es posible, solo tiene que usar una subclase de lista para hacerlo.

class GrowingList(list): 
    def __setitem__(self, index, value): 
     if index >= len(self): 
      self.extend([None]*(index + 1 - len(self))) 
     list.__setitem__(self, index, value) 

Uso:

>>> grow = GrowingList() 
>>> grow[10] = 4 
>>> len(grow) 
11 
>>> grow 
[None, None, None, None, None, None, None, None, None, None, 4] 
+0

Gracias, eso es exactamente lo que necesitaba. – Anonymous

+0

No hay problema, me complace ayudarlo. –

+5

Solo tenga en cuenta que esto solo es realmente útil para matrices densas, si necesita una estructura para matrices dispersas, entonces es mejor con una solución basada en diccionario. –

-1

No, pero podría usar un diccionario (tabla hash) para lograr lo mismo.

+0

Gracias, pero necesito que se ordene. – Anonymous

+0

A continuación, puede probar el objeto [OrderedDict] (http://docs.python.org/library/collections.html#collections.OrderedDict). ;-) – Keith

+0

Esto no funciona porque los diccionarios no tienen índices. – Anonymous

-1

Las listas son dinámicas en python. Crecerá automáticamente siempre (hasta que toques sys.maxsize) en tu programa.

l = list() 
    l.append(item) 

Seguir haciendo eso.

+0

No, quiero decir que crecerá cuando se haga referencia a un índice fuera de rango. Por ejemplo, a = [1,2,3] crecerá cuando se llame a [100] = 101. – Anonymous

+0

¿Cuáles deberían ser los valores de 'a [3]' a 'a [99]' después de esto? –

+0

En Ruby, los elementos intermedios se establecen en 'nil'; en Python, 'None' sería la elección lógica. –