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

81

Tengo una lista:

list1=[]

la longitud de la lista no está determinada, por lo que estoy tratando de agregar objetos al final de list1 como tal:

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'

¿Es esto porque list1 comienza como una lista vacía? ¿Cómo soluciono este error?

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

Respuestas:

73

appenden realidad cambia la lista. Además, se necesita un elemento , no una lista. Por lo tanto, todo lo que necesitas es

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

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

Supongo que su uso real es más complicado, pero es posible que pueda usar una lista de comprensión, que es más pitónica 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)).

Andrew Jaffe
fuente
gracias, el último bit fue muy útil y acortó mi código en un montón
LostLin
@AndrewJaffe, ¿qué tal una lista de listas?
Py-ser
1
Depende de lo que quieras hacer. appendagrega a la lista más externa, pero puede agregar a una lista anidada indexándola: a[-1].append(3)agrega 3a la última sublista de a.
Andrew Jaffe
18

No necesita el operador de asignación. añadir devuelve Ninguno.

Mikola
fuente
void no existe en Python. el vacío es en realidad Ninguno
Jakob Bowyer
5

appenddevuelve None, por lo que en la segunda iteración está llamando al método appendde NoneType. Simplemente elimine la asignación:

for i in range(0, n):
    list1.append([i])
Yuri Stuken
fuente
3

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

Endófago
fuente
3

Personalmente prefiero al +operador que append:

for i in range(0, n):

    list1 += [[i]]

Pero esto crea una nueva lista cada vez, por lo que podría no ser la mejor si el rendimiento es fundamental.

Petar Ivanov
fuente
1

Tenga en cuenta que también puede usar insertar para colocar el número en la posición requerida 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 tenga en cuenta que en Python siempre puede obtener una longitud de lista usando el método len ()

Artsiom Rudzenka
fuente
0

Como dijo Mikola, append()devuelve un vacío, por lo que cada iteración que estableces list1 en nonetype porque append devuelve 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í su error.

John
fuente
-3

use my_list.append (...) y no use y otra lista para agregar ya que la lista es mutable.

Ranjit
fuente
2
Esta respuesta es difícil de entender (no estoy seguro de lo que quiere decir con la segunda parte, por ejemplo) y repite la información de las respuestas existentes (de 2014) o (si se toma literalmente) es completamente incorrecta (el código de OP no contiene my_listvariable).
melpomene