2011-06-14 7 views
46

Tengo una lista:¿Cómo agregar al final de una lista vacía?

list1=[] 

la longitud de la lista no está determinado por lo que estoy tratando de agregar objetos al final de la lista1 como tales:

for i in range(0, n): 

    list1=list1.append([i]) 

Pero mi salida sigue dando este error : AttributeError: el objeto 'NoneType' no tiene atributo 'append'

¿Esto se debe a que list1 comienza como una lista vacía? ¿Cómo soluciono este error?

+25

No -1 por favor. El hecho de que append() devuelva None puede engañar a los principiantes. La pregunta es genuina –

Respuesta

47

append en realidad cambia la lista. Además, toma un elemento, no una lista. Por lo tanto, todo lo que necesita es

for i in range(n): 
    list1.append(i) 

(Por cierto, tenga en cuenta que puede utilizar range(n), en este caso.)

que asumen su uso real es más complicado, pero es posible que pueda utilizar una lista por comprensión, que es más Pythonic para esto:

list1 = [i for i in range(n)] 

O, en este caso, en Python 2.x range(n) de hecho crea la lista que ya desea, aunque en Python 3.x, necesita list(range(n)) .

+0

gracias ese último bit fue muy útil y acorté mi código por un grupo – LostLin

+0

@AndrewJaffe, ¿qué tal una lista de listas? –

+1

Depende de lo que quieras hacer. 'append' se agrega a la lista más externa, pero puede agregarla a una lista anidada al indexarla:' a [-1] .append (3) 'agrega' 3' a la última sublista de 'a'. –

13

No necesita el operador de asignación. append devuelve None.

+4

s/do not need/should not use/ –

+0

void no existe en python. void es en realidad Ninguno –

2

append devuelve Ninguno, por lo que en la segunda iteración está llamando al método append de NoneType. Basta con retirar la misión:

for i in range(0, n): 
    list1.append([i]) 
0

Al igual que Mikola dijo append(), devuelve un vacío, por lo que cada iteración se está configurando lista1 a un NoneType porque append devuelve un NoneType. En la siguiente iteración, list1 es nulo, por lo que está intentando llamar al método append de un nulo. Los nulos no tienen métodos, de ahí tu error.

4

Mikola tiene la respuesta correcta pero un poco más de explicación. Se ejecutará la primera vez, pero como append devuelve None, después de la primera iteración del bucle for, su asignación hará que list1 sea igual a None y, por lo tanto, el error se produce en la segunda iteración.

0

Tenga en cuenta que también se puede utilizar de inserción con el fin de poner el número en la posición deseada dentro de la lista:

initList = [1,2,3,4,5] 
initList.insert(2, 10) # insert(pos, val) => initList = [1,2,10,3,4,5] 

Y también en cuenta que en Python siempre se puede conseguir una longitud de la lista utilizando el método len()

1

yo personalmente prefiero el operador + que append:

for i in range(0, n): 

    list1 += [[i]] 

Pero esto es la creación de una nueva lista cada vez, así que podría no ser el mejor si el rendimiento es crítico.

-1

use my_list.append (...) y no lo use y otras listas para anexar como lista son mutables.

+2

Esta respuesta es difícil de entender (no estoy seguro de lo que quiere decir con la segunda parte, por ejemplo) y repite información de las respuestas existentes (a partir de 2014) o (si se toma literalmente) está completamente equivocada (el código de OP contiene no hay una variable 'my_list'). – melpomene

Cuestiones relacionadas