Es esto posible:

myList = []

myList[12] = 'a'
myList[22] = 'b'
myList[32] = 'c'
myList[42] = 'd'

Cuando lo intento, me sale:

# IndexError: list assignment index out of range # 
  • milista = () es real una tupla, no se puede agregar, eliminar o buscar objetos en una tupla.
  • Sí, yo en realidad utiliza [] en el código, se mezclaron hasta aquí.
InformationsquelleAutor Joan Venge | 2009-05-15

7 Comentarios

  1. 50

    Tendrás que rellenar con algo (por ejemplo, 0 o None) antes de que pueda índice es:

    myList = [None] * 100  # Create list of 100 'None's
    myList[12] = 'a'  # etc.

    Alternativamente, el uso de un diccionario en lugar de una lista, como Alex Martelli sugerido.

  2. 27

    Para una «escasa lista de» usted podría utilizar un dict lugar:

    mylist = {}
    mylist[12] = 'a'

    etc. Si desea una lista real (inicializar con [], no (), ¡por supuesto!-) es necesario rellenar la onu-conjunto de ranuras para _some_thing, por ejemplo,None, por un poco de auxiliar de la función o por subclases de list.

    • A juzgar por el error, yo creo que él era en realidad el uso de una lista, no una tupla.
    • probablemente no sea la mejor práctica para llamar a su diccionario mylist.
    • Gracias necesito lineal acceso al elemento, así que voy a ser capaz de índice de 1 a n, por lo que no se puede utilizar el diccionario.
    • Asegúrese de que usted puede, hay un montón de maneras de hacer que con un diccionario. es decir, «para k en la ordenada(mydict.las teclas()): print mydict[k]»
    • La indexación de 1 a n en el diccionario todavía funciona. for i in range(n): if n in dictionary: print dictionary[n] hace lo que quiere.
    • no dar un dict un índice numérico ser un poco contra intuitivo para cualquier persona trabajando con el código a pesar de que
    • El diccionario no va a estar en orden al recorrer.

  3. 18

    He aquí una lista rápida de contenedor que se auto-ampliar su lista con ceros si se intenta asignar un valor a un índice pasado de su longitud.

    class defaultlist(list):
    
       def __setitem__(self, index, value):
          size = len(self)
          if index >= size:
             self.extend(0 for _ in range(size, index + 1))
    
          list.__setitem__(self, index, value)

    Ahora usted puede hacer esto:

    >>> a = defaultlist([1,2,3])
    >>> a[1] = 5
    [1,5,3]
    >>> a[5] = 10
    [1,5,3,0,0,10]
    • muy bonito! simple y elegante, gracias
  4. 2

    No sin rellenar los demás lugares en la lista con algo (como None o una cadena vacía). Tratando de insertar un elemento en una lista mediante el código que escribió habría resultado en una IndexError.

    También hay mylist.insert, pero este código:

    myList.insert(12,'a')

    acaba de insertar ‘a’ en la primera desocupada ubicación en la lista (que sería 0, usando tu ejemplo).

    Así que, como dije, tiene que haber algo en la lista de los índices de 0-11 antes de insertar algo en el myList[12].

    • De hecho, la lista.insertar() no es una solución correcta, ya que la colocación de un elemento se moverá todos los otros índices.
  5. 2

    Si usted no sabe el tamaño de la lista por delante de tiempo, usted podría utilizar try/except y, a continuación, Ampliar la lista en la excepción:

    L = []
    def add(i, s):
        try:
            L[i] = s
        except IndexError:
            L.extend([None]*(i-len(L)+1))
            L[i] = s
    
    add(12, 'a')
    add(22, 'b')

    —– Actualización ———————————————

    Por tgray comentario: Si es probable que el código se generará una Excepción la mayoría del tiempo, usted debe comprobar la longitud de la Lista cada vez, y evitar las Excepciones:

    L = []
    def add(i, s):
        size = len(L)
        if i >= size:
            L.extend([None]*(i-size+1))
            L[i] = s
    • Si es la adición de elementos con el aumento de los índices, la velocidad, probablemente podría ser mejorada mediante el uso de un ‘if’ en lugar de un «try-catch’. En este caso sería la captura de la excepción, cada vez, que es más «caro» de comprobación de la longitud de L todo el tiempo.
    • ¿Tienes un enlace a la fuente indica que es más «caro»? O ¿por cuánto? Que sería de gran ayuda.
    • Aquí hay un enlace a la fuente de mi comentario: paltman.com/2008/jan/18/…
    • He añadido otra solución.
  6. 1

    Sólo en caso de que alguien necesita, me di cuenta de una soluction para mi problema, yo necesitaba calc un montón de factoriales, algunos de ellos podría repetirse, así que aquí está mi solución:

    factorials = {}
    
    def calcFact(v):
        try:
            return factorials[v]
        except KeyError:
            factorials[v] = math.factorial(v)
            return factorials[v]

    Testcase:

    calcFact(99000)
    calcFact(90900)
    calcFact(90090)
    calcFact(90009)
    calcFact(90009) #repeated
    calcFact(90009) #repeated

    Resultados:

    La repetición de matemática calc: 1.576 s

    Utilizando el código de arriba (una lista para almacenar valores repetidos): 1.011 s

    • Esto no proporciona una respuesta a la pregunta. Para la crítica o la solicitud de aclaración de un autor, deja un comentario debajo de su post.
    • como he dicho en mi respuesta, esto era algo que tenía que resolver, y que estaba relacionado con «Llenar una lista o matriz por el índice de» como se puede notar por la lectura del código. Esta es la manera de resolver la cuestión, pero con un ejemplo diferente.
  7. 0

    Edificio en la parte superior de Tríptico.. Si quieres una lista arbitraria de dimensiones

    class dynamiclist(list):
        """ List not needing pre-initialization
    
        Example:
            l = dynamiclist()
            l[20][1] = 10
            l[21][1] = 20
        """
    
        def __setitem__(self, index, value):
            size = len(self)
            if index >= size:
                self.extend(dynamiclist() for _ in range(size, index + 1))
    
            list.__setitem__(self, index, value)
    
        def __getitem__(self, index):
            size = len(self)
            if index >= size:
                self.extend(dynamiclist() for _ in range(size, index + 1))  # allows dimensions > 1
    
            return list.__getitem__(self, index)

    Ejemplo

    l = dynamiclist()
    l[20][1] = 10
    l[21][1] = 20

Dejar respuesta

Please enter your comment!
Please enter your name here