2011-04-13 21 views
114

Por favor, considere el siguiente código:IndexError: lista de índice de asignación fuera de rango

i = [1, 2, 3, 5, 8, 13] 
j = [] 
k = 0 

for l in i: 
    j[k] = l 
    k += 1 

print j 

La salida (Python 2.6.6 en Windows 7 de 32 bits) es:

> Traceback (most recent call last): 
>  j[k] = l IndexError: list assignment index out of range 

supongo que es algo simple que no entiendo. ¿Alguien puede aclararlo?

+3

'append' es la solución adecuada para su caso de uso, sin embargo, hay un método de inserción en la lista de Python que puede insertarse directamente en la posición i de la lista. 'j.insert (k, l)' – opensourcegeek

Respuesta

183

j es una lista vacía, pero está intentando escribir en el elemento [0] en la primera iteración, que todavía no existe.

Pruebe el siguiente lugar, añadir un nuevo elemento al final de la lista:

for l in i: 
    j.append(l) 
+1

OK, muchas gracias. No sabía cuál elogiar, ya que hay tres respuestas casi iguales. Esto es más descriptivo, creo. Saludos – Vladan

13

Haga j.append(l) en lugar de j[k] = l y evite k en absoluto.

+2

Una forma más corta (¿más pitonica?) podría ser 'j + = [l]' –

+2

@BlaXpirit: supondrá una carga para el recolector de basura. – khachik

+2

@BalXpirit: dado que solo guarda unos pocos caracteres (especialmente porque necesita agregar espacios para que sea aceptable) y que '.append' es mucho más común (quizás por una razón, creo que es un poco más fácil de comprender), no es realmente superior de ninguna manera. (Editar @khachik: No, '+ =' modifica en contexto) – delnan

6
j.append(l) 

también evitar el uso de minúscula "L's", ya que es fácil para ellos ser confundidos con

27

Su otra opción de 1 es inicializar j:

j = [None]*max(i) 
9

para el ejemplo informados, también se puede utilizar una lista de comprensión:

j = [l for l in i] 

o simplemente hacer una copia:

j = i[:] 
+0

esa segunda construcción es ordenada – javadba

1

una forma más:

j=i[0] 
for k in range(1,len(i)): 
    j = numpy.vstack([j,i[k]]) 

En este caso j habrá un numpy matriz

3

Creo que el método de python inserta ¿Qué es yo? estás buscando;

Inserta el elemento x en la posición i.

array = [1,2,3,4,5] 

array.insert(1,2) 

print array 

# prints [2,2,3,4,5] 
3

Se puede usar un diccionario (similar a una matriz asociativa) para j

i = [1, 2, 3, 5, 8, 13] 
j = {} #initiate as dictionary 
k = 0 

for l in i: 
    j[k] = l 
    k += 1 

print j 

imprimirá:

{0: 1, 1: 2, 2: 3, 3: 5, 4: 8, 5: 13} 
Cuestiones relacionadas