Wie entferne ich ein Element aus einer Liste nach Index in Python?
Ich habe die list.remove
Methode gefunden, möchte aber sagen, dass ich das letzte Element entfernen möchte. Wie mache ich das? Es scheint, als würde das Standard-Entfernen die Liste durchsuchen, aber ich möchte nicht, dass eine Suche durchgeführt wird.
O(n)
im Zeitbetrieb befindet.deque()
Bietet effiziente Operationen an beiden Enden, bietet jedoch keine O (1) Einfügungen / Suchvorgänge / Löschungen in der Mitte.O(n)
Indexzugriffa[i]
(durch verknüpfte Listen). Hinweis: Die Array-basierte Implementierung bietetO(1)
Indexzugriff.Antworten:
Verwenden
del
und geben Sie den Index des Elements an, das Sie löschen möchten:Unterstützt auch Slices:
Hier ist der Abschnitt aus dem Tutorial.
quelle
PyList_GetItem()
Wesentlichen((PyListObject *)op) -> ob_item[i];
dasi
th-Element eines Arrays zurückgegeben wird.Sie wollen wahrscheinlich
pop
:Standardmäßig wird
pop
ohne Argumente das letzte Element entfernt:quelle
pop()
an sich sehr offensichtlich, währendpop(-1)
es gerade deshalb möglicherweise verwirrend ist, weil es redundant ist.pop
in den meisten Programmiersprachen normalerweise das letzte Element, wie dies in Python der Fall ist. Ob Sie also -1 oder nichts angeben, ist gleich.pop()
entfernte Element zurück.Wie bereits erwähnt, sind Pop und Del die effiziente Möglichkeit, ein Element eines bestimmten Index zu entfernen. Nur zur Vervollständigung (da dasselbe in Python auf viele Arten möglich ist):
Verwenden von Slices (dies führt nicht zum Entfernen des Elements aus der ursprünglichen Liste):
(Dies ist auch die am wenigsten effiziente Methode, wenn Sie mit Python-Listen arbeiten. Dies kann jedoch nützlich sein (aber nicht effizient, wie ich wiederhole), wenn Sie mit benutzerdefinierten Objekten arbeiten, die Pop nicht unterstützen, aber a definieren:)
__getitem__
:Hinweis: Bitte beachten Sie, dass diese Methode die Liste wie
pop
und nicht ändertdel
. Stattdessen werden zwei Kopien von Listen erstellt (eine vom Anfang bis zum Index, jedoch ohne (a[:index]
) und eine nach dem Index bis zum letzten Element (a[index+1:]
)) und ein neues Listenobjekt erstellt, indem beide hinzugefügt werden. Dies wird dann der Listenvariablen (a
) neu zugewiesen . Das alte Listenobjekt wird daher dereferenziert und somit Müll gesammelt (vorausgesetzt, das ursprüngliche Listenobjekt wird von keiner anderen Variablen als a referenziert).Dies macht diese Methode sehr ineffizient und kann auch unerwünschte Nebenwirkungen hervorrufen (insbesondere wenn andere Variablen auf das ursprüngliche Listenobjekt verweisen, das unverändert bleibt).
Vielen Dank an @MarkDickinson für diesen Hinweis ...
Diese Antwort zum Stapelüberlauf erläutert das Konzept des Schneidens.
Beachten Sie auch, dass dies nur mit positiven Indizes funktioniert.
Bei der Verwendung mit Objekten muss die
__getitem__
Methode definiert worden sein, und was noch wichtiger ist, die__add__
Methode muss definiert worden sein, um ein Objekt zurückzugeben, das Elemente aus beiden Operanden enthält.Im Wesentlichen funktioniert dies mit jedem Objekt, dessen Klassendefinition wie folgt lautet:
Dies funktioniert mit
list
welchen Definitionen__getitem__
und__add__
Methoden.Vergleich der drei Möglichkeiten hinsichtlich der Effizienz:
Angenommen, Folgendes ist vordefiniert:
Die
del object[index]
Methode:Mit Abstand die effizienteste Methode. Es funktioniert mit allen Objekten, die eine
__del__
Methode definieren .Die Demontage ist wie folgt:
Code:
Demontage:
pop
Methode:Es ist weniger effizient als die del-Methode und wird verwendet, wenn Sie das gelöschte Element abrufen müssen.
Code:
Demontage:
Die Slice-and-Add-Methode.
Am wenigsten effizient.
Code:
Demontage:
Hinweis: Ignorieren Sie bei allen drei Demontagen die letzten beiden Zeilen, die im Grunde genommen sind
return None
. Auch die ersten beiden Zeilen laden die globalen Wertea
undindex
.quelle
a = a[:index] + a[index+1 :]
-trick der sicherste, wenn es um riesige Listen geht. Alle anderen Methoden endeten in einem Deadlock. Also vielen Dankpop
ist auch nützlich, um ein Element zu entfernen und aus einer Liste zu behalten. Wodel
der Gegenstand tatsächlich weggeworfen wird.quelle
Wenn Sie das bestimmte Positionselement in einer Liste entfernen möchten, z. B. das 2., 3. und 7 .. du kannst nicht benutzen
Da nach dem Löschen des zweiten Elements das dritte Element, das Sie löschen, tatsächlich das vierte Element in der ursprünglichen Liste ist. Sie können das 2., 3. und 7. Element in der ursprünglichen Liste filtern und eine neue Liste erhalten, wie unten:
quelle
Dies hängt davon ab, was Sie tun möchten.
Wenn Sie das entfernte Element zurückgeben möchten, verwenden Sie
pop()
:Wenn Sie jedoch nur ein Element löschen möchten, verwenden Sie
del
:Außerdem
del
können Sie Slices verwenden (zdel[2:]
. B. ).quelle
Im Allgemeinen verwende ich die folgende Methode:
quelle
Eine weitere Möglichkeit, ein oder mehrere Elemente nach Index aus einer Liste zu entfernen.
a [x: y] zeigt auf die Elemente von Index
x
bisy-1
. Wenn wir diesen Teil der Liste als leere Liste deklarieren ([]
), werden diese Elemente entfernt.quelle
Sie können einfach nach dem Element suchen, das Sie löschen möchten. Es ist wirklich einfach. Beispiel:
Ausgabe: acde
quelle
Verwenden Sie den folgenden Code, um das Element aus der Liste zu entfernen:
Wenn Sie Indexelementdaten aus der Liste entfernen möchten, verwenden Sie:
quelle
Wie bereits erwähnt, ist die beste Vorgehensweise del (). oder pop (), wenn Sie den Wert kennen müssen.
Eine alternative Lösung besteht darin, nur die gewünschten Elemente neu zu stapeln:
eta: hmm ... funktioniert nicht bei negativen Indexwerten, denkt nach und aktualisiert
Schätze ich
würde es flicken ... aber plötzlich scheint diese Idee sehr spröde. Interessantes Gedankenexperiment. Es scheint, dass es einen "richtigen" Weg geben sollte, dies mit dem Verständnis von append () / list zu tun.
Nachdenken
quelle
del()
? Für diese Funktion geben Sie die Liste als erstes Argument für diese Funktion an und dann den Index oder zuerst den Index und dann die Liste? Gibt es das Listenargument ohne das Element zurück oder löscht es an Ort und Stelle. Ich kenne diedel
Anweisung, aber nicht eine Funktion mit demselben Namen.Es hört sich nicht so an, als würden Sie mit einer Liste von Listen arbeiten, also werde ich mich kurz fassen. Sie möchten Pop verwenden, da dadurch Elemente entfernt werden, die keine Listen sind. Verwenden Sie dazu del. Um das letzte Element in Python aufzurufen, ist es "-1".
quelle
pop()
unddel
beide entfernen ein Element am bereitgestellten Index, unabhängig davon, ob dieses Element selbst eine Liste ist oder nicht.a = [1, [2, 3], 4]; del a[1]; b = [1, [2, 3], 4]; b.pop(1); assert a == b
l - Werteliste; Wir müssen Indizes aus der inds2rem- Liste entfernen .
quelle
<map at 0x7f4d54109a58>
. und l ist Bereich (0,20)Verwenden Sie die Funktion "del" :
Wenn Sie beispielsweise die letzten drei Elemente entfernen möchten, sollte Ihr Code wie folgt lauten:
Wenn Sie beispielsweise die letzten 8 Elemente entfernen möchten, sollte Ihr Code wie folgt lauten:
quelle
del
ist eine Aussage . Wenn es eine Funktion wäre, müssten Sie schreibendel(listame[-N])
Es wurde bereits erwähnt, wie ein einzelnes Element aus einer Liste entfernt werden kann und welche Vorteile die verschiedenen Methoden haben. Beachten Sie jedoch, dass das Entfernen mehrerer Elemente zu Fehlern führen kann:
Die Elemente 3 und 8 (nicht 3 und 7) der ursprünglichen Liste wurden entfernt (da die Liste während der Schleife gekürzt wurde), was möglicherweise nicht beabsichtigt war. Wenn Sie mehrere Indizes sicher entfernen möchten, sollten Sie stattdessen zuerst die Elemente mit dem höchsten Index löschen, z. B.:
quelle
Oder wenn mehrere Indizes entfernt werden sollen:
Natürlich könnte man dann auch:
quelle
Sie können entweder del oder pop verwenden, um Elemente basierend auf dem Index aus der Liste zu entfernen. Pop druckt das Mitglied, das aus der Liste entfernt wird, während die Liste dieses Mitglied löscht, ohne es zu drucken.
quelle
Man kann entweder del oder pop verwenden, aber ich bevorzuge del, da Sie Index und Slices angeben können, um dem Benutzer mehr Kontrolle über die Daten zu geben.
Beginnend mit der angezeigten Liste kann man beispielsweise das letzte Element mit
del
als Slice entfernen und dann das letzte Element mit aus dem Ergebnis entfernenpop
.quelle