Wie füge ich das Ende einer leeren Liste hinzu?

80

Ich habe eine Liste:

list1=[]

Die Länge der Liste ist unbestimmt, daher versuche ich, Objekte wie folgt an das Ende von Liste1 anzuhängen:

for i in range(0, n):

    list1=list1.append([i])

Meine Ausgabe gibt jedoch weiterhin den folgenden Fehler aus: AttributeError: Das Objekt 'NoneType' hat kein Attribut 'append'.

Liegt das daran, dass list1 als leere Liste beginnt? Wie behebe ich diesen Fehler?

LostLin
quelle
41
Nein -1 bitte. Die Tatsache, dass append () None zurückgibt, kann Anfänger austricksen. Die Frage ist echt.
E-Satis

Antworten:

73

appendändert tatsächlich die Liste. Außerdem wird ein Element und keine Liste benötigt. Alles was Sie brauchen ist

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

(Beachten Sie übrigens, dass Sie range(n)in diesem Fall verwenden können.)

Ich gehe davon aus, dass Ihre tatsächliche Verwendung komplizierter ist, aber Sie können möglicherweise ein Listenverständnis verwenden, das dafür pythonischer ist:

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

In diesem Fall erstellt Python 2.x range(n)tatsächlich die Liste, die Sie bereits möchten, obwohl Sie dies in Python 3.x benötigen list(range(n)).

Andrew Jaffe
quelle
danke, dass das letzte bisschen sehr hilfreich war und meinen Code um ein paar verkürzte
LostLin
@ AndrewJaffe, was ist mit einer Liste von Listen?
Py-ser
1
Es hängt davon ab, was Sie tun möchten. appendwird zur äußersten Liste a[-1].append(3)hinzugefügt , aber Sie können eine verschachtelte Liste anhängen, indem Sie sie indizieren: 3an die letzte Unterliste von anhängen a.
Andrew Jaffe
18

Sie benötigen den Zuweisungsoperator nicht. Anhängen gibt keine zurück.

Mikola
quelle
void existiert in Python nicht. nichtig ist eigentlich keine
Jakob Bowyer
5

appendappendGibt None zurück, sodass Sie bei der zweiten Iteration die Methode NoneType aufrufen. Entfernen Sie einfach die Zuordnung:

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

Mikola hat die richtige Antwort, aber etwas mehr Erklärung. Es wird das erste Mal ausgeführt, aber da das Anhängen Nonenach der ersten Iteration der for-Schleife zurückgegeben wird, wird Ihre Zuweisung list1gleich Noneund daher wird der Fehler bei der zweiten Iteration ausgelöst.

Endophage
quelle
3

Ich persönlich bevorzuge den +Betreiber als append:

for i in range(0, n):

    list1 += [[i]]

Dies erstellt jedoch jedes Mal eine neue Liste und ist daher möglicherweise nicht die beste, wenn die Leistung kritisch ist.

Petar Ivanov
quelle
1

Beachten Sie, dass Sie auch Einfügen verwenden können, um die Nummer an der gewünschten Stelle in der Liste zu platzieren:

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

Beachten Sie auch, dass Sie in Python immer eine Listenlänge mit der Methode len () erhalten können.

Artsiom Rudzenka
quelle
0

Wie Mikola sagte, append()gibt eine Leere zurück, sodass jede Iteration, die Sie list1 auf einen Nichttyp setzen, weil append einen Nichttyp zurückgibt. Bei der nächsten Iteration ist list1 null, sodass Sie versuchen, die Append-Methode einer Null aufzurufen. Nullen haben keine Methoden, daher Ihr Fehler.

John
quelle
-3

Verwenden Sie my_list.append (...) und verwenden Sie keine andere Liste, um sie als Liste anzuhängen.

Ranjit
quelle
2
Diese Antwort ist schwer zu verstehen (ich bin mir nicht sicher, was Sie zum Beispiel mit dem zweiten Teil meinen) und wiederholt entweder Informationen aus den vorhandenen Antworten (ab 2014) oder ist (wörtlich genommen) völlig falsch (OPs Code enthält Nein my_listVariable).
Melpomene