Unterschied zwischen Löschen, Entfernen und Pop-on-Listen

927
>>> a=[1,2,3]
>>> a.remove(2)
>>> a
[1, 3]
>>> a=[1,2,3]
>>> del a[1]
>>> a
[1, 3]
>>> a= [1,2,3]
>>> a.pop(1)
2
>>> a
[1, 3]
>>> 

Gibt es einen Unterschied zwischen den oben genannten drei Methoden zum Entfernen eines Elements aus einer Liste?

Sachin Irukula
quelle
1
In Verbindung stehender Beitrag in ähnlichen Zeilen für die Set-Datenstruktur - Laufzeitunterschied zwischen den Methoden set.discard und set.remove in Python?
RBT

Antworten:

1331

Ja, removeentfernt den ersten übereinstimmenden Wert , keinen bestimmten Index:

>>> a = [0, 2, 3, 2]
>>> a.remove(2)
>>> a
[0, 3, 2]

del Entfernt das Element an einem bestimmten Index:

>>> a = [9, 8, 7, 6]
>>> del a[1]
>>> a
[9, 7, 6]

und popentfernt das Element an einem bestimmten Index und gibt es zurück.

>>> a = [4, 3, 5]
>>> a.pop(1)
3
>>> a
[4, 5]

Ihre Fehlermodi sind ebenfalls unterschiedlich:

>>> a = [4, 5, 6]
>>> a.remove(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>> del a[7]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> a.pop(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range
Martijn Pieters
quelle
14
@jxramos: delist kein Syntax-Holdover, nein. Die Syntax bleibt unverändert, genau wie returnoder ifoder while.
Martijn Pieters
6
Es ist erwähnenswert, dass Benutzer vorsichtig sein sollten, wenn sie eine Liste durchlaufen und diese Funktionen gleichzeitig mit der Iteration verwenden.
Hamaney
16
Das delBeispiel ist etwas irreführend. Welches Element wird genau entfernt? Der 2. oder der 3.? Sie sollten verwendet haben [9, 8, 7, 6], del a[1]und[9, 7, 6]
gromit190
2
@ rite2hhh es prüft auf Gleichheit. Gleichheitstests testen zuerst die Identität als Optimierung
Martijn Pieters
1
@ rite2hhh: Wertgleichheit wird in der Ausdrucksreferenz behandelt .
Martijn Pieters
183

Verwenden Sie deldiese Option , um ein Element nach Index pop()zu entfernen, um es nach Index zu entfernen, wenn Sie den zurückgegebenen Wert benötigen, und remove()um ein Element nach Wert zu löschen. Letzteres erfordert das Durchsuchen der Liste und wird ausgelöst, ValueErrorwenn in der Liste kein solcher Wert vorkommt.

Beim Löschen eines Index iaus einer Liste von nElementen sind die rechnerischen Komplexitäten dieser Methoden

del     O(n - i)
pop     O(n - i)
remove  O(n)
Sven Marnach
quelle
1
Benötigt
31
+1 für die Aufschlüsselung der Komplexität. Veranschaulicht, wie Löschen und Pop konstant sind, wenn sich das Element am Ende der Liste befindet.
Big Sharpie
2
Denken Sie daran, Leute ... alles, was auf einem Index basiert, ist ein Schuss O (n-1) ... Wenn Sie eine Suche (nach Wert) durchführen müssen, durchläuft es die Sammlung, bis das Element gefunden wird.
Pepito Fernandez
2
@PepitoFernandez Nachschlagen nach Index in einer Liste sind in Python O (1). (Eine Liste in Python ähnelt einem Vektor in C ++.)
Sven Marnach
3
@PlasmaBinturong Sie sollten das verwenden, was Ihrer Meinung nach besser lesbar ist, es sei denn, Sie haben Daten, die belegen, dass die Leistung wichtig ist. Und wenn ja, müssen Sie messen, was in Ihrem speziellen Fall schneller ist. Ich vermute auch, dass dies deletwas schneller ist, aber aus einem anderen Grund: Die Suche nach __delitem__einem in C implementierten Typ erfolgt eher nach Index als nach Name, während popnach dem gesamten Deskriptorprotokoll gesucht werden muss. Die Ausführung der Funktionen selbst sollte genauso lange dauern. Beide geben einen Zeiger zurück - einen auf das entfernte Objekt, den anderen auf None.
Sven Marnach
91

Da dies von niemand anderem erwähnt wurde, ist zu beachten, dass del(im Gegensatz zu pop) das Entfernen einer Reihe von Indizes aufgrund von Listenaufteilung möglich ist:

>>> lst = [3, 2, 2, 1]
>>> del lst[1:]
>>> lst
[3]

Dies ermöglicht auch die Vermeidung von a, IndexErrorwenn der Index nicht in der Liste enthalten ist:

>>> lst = [3, 2, 2, 1]
>>> del lst[10:]
>>> lst
[3, 2, 2, 1]
Chris_Rands
quelle
55

Schon ganz gut von anderen beantwortet. Dieser von meinem Ende :)

entfernen vs pop vs del

Offensichtlich popist es das einzige, das den Wert zurückgibt, und es removeist das einzige, das das Objekt durchsucht, während es delsich auf ein einfaches Löschen beschränkt.

Saurav Sahu
quelle
2
Danke! Ein Hinweis: In Python ist "Advance bis zu dieser Knotenposition" aufgrund der Art und Weise, wie die Listen implementiert sind (es gibt praktisch Arrays ...!), O (1)
ntg
19

Viele beste Erklärungen sind hier, aber ich werde mein Bestes geben, um mehr zu vereinfachen.

Unter all diesen Methoden sind Reverse & Pop Postfix, während Delete das Präfix ist .

remove (): Dient zum Entfernen des ersten Auftretens eines Elements

remove(i) => erstes Auftreten des i-Wertes

>>> a = [0, 2, 3, 2, 1, 4, 6, 5, 7]
>>> a.remove(2)   # where i = 2
>>> a
[0, 3, 2, 1, 4, 6, 5, 7]

pop (): Dient zum Entfernen von Elementen, wenn:

nicht spezifiziert

pop() => vom Ende der Liste

>>>a.pop()
>>>a
[0, 3, 2, 1, 4, 6, 5]

spezifizierten

pop(index) => des Index

>>>a.pop(2)
>>>a
[0, 3, 1, 4, 6, 5]

WARNUNG: Gefährliche Methode voraus

delete () : Dies ist eine Präfixmethode.

Behalten Sie zwei verschiedene Syntax für dieselbe Methode im Auge: [] und (). Es besitzt die Macht:

1. Index löschen

del a[index] => wird verwendet, um den Index und den zugehörigen Wert genau wie pop zu löschen.

>>>del a[1]
>>>a
[0, 1, 4, 6, 5]

2. Werte im Bereich löschen [Index 1: Index N]

del a[0:3] => mehrere Werte im Bereich

>>>del a[0:3]
>>>a
[6, 5]

3.Letzte, aber keine Liste, um die gesamte Liste auf einmal zu löschen

del (a) => wie oben gesagt.

>>>del (a)
>>>a

Hoffe, dies klärt die Verwirrung, wenn überhaupt.

Mayur Patil
quelle
18

pop - Nimmt den Index und gibt den Wert zurück

remove - Nimmt den Wert an, entfernt das erste Vorkommen und gibt nichts zurück

delete - Nimmt den Index, entfernt den Wert an diesem Index und gibt nichts zurück

Bahubali Patil
quelle
2

Jede Operation / Funktion für verschiedene Datenstrukturen ist für bestimmte Aktionen definiert. Hier in Ihrem Fall dh ein Element entfernen, löschen, Pop und entfernen. (Wenn Sie Sätze in Betracht ziehen, fügen Sie eine weitere Operation hinzu - verwerfen Sie) Ein anderer verwirrender Fall ist beim Hinzufügen. Einfügen / Anhängen. Lassen Sie uns zur Demonstration deque implementieren. deque ist eine hybride lineare Datenstruktur, in der Sie Elemente an beiden Enden hinzufügen / entfernen können. (Hinteres und vorderes Ende)

class Deque(object):

  def __init__(self):

    self.items=[]

  def addFront(self,item):

    return self.items.insert(0,item)
  def addRear(self,item):

    return self.items.append(item)
  def deleteFront(self):

    return self.items.pop(0)
  def deleteRear(self):
    return self.items.pop()
  def returnAll(self):

    return self.items[:]

Hier sehen Sie die Operationen:

def deleteFront(self):

    return self.items.pop(0)
def deleteRear(self):
    return self.items.pop()

Operationen müssen etwas zurückgeben. Also, Pop - Mit und ohne Index. Wenn ich den Wert nicht zurückgeben möchte: del self.items [0]

Löschen nach Wert nicht Index:

  • entfernen :

    list_ez=[1,2,3,4,5,6,7,8]
    for i in list_ez:
        if i%2==0:
            list_ez.remove(i)
    print list_ez

Rückgabe [1,3,5,7]

Betrachten wir den Fall von Mengen.

set_ez=set_ez=set(range(10))

set_ez.remove(11)

# Gives Key Value Error. 
##KeyError: 11

set_ez.discard(11)

# Does Not return any errors.
Phanindravarma
quelle
1

Während Pop und Delete beide Indizes verwenden, um ein Element zu entfernen, wie in den obigen Kommentaren angegeben. Ein wesentlicher Unterschied ist die zeitliche Komplexität für sie. Die zeitliche Komplexität für pop () ohne Index ist O (1), ist jedoch nicht der gleiche Fall für das Löschen des letzten Elements.

Wenn Ihr Anwendungsfall immer darin besteht, das letzte Element zu löschen, ist es immer vorzuziehen, pop () gegenüber delete () zu verwenden. Weitere Erläuterungen zu Zeitkomplexitäten finden Sie unter https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

Skashyap
quelle
2
Dies ist in mehrfacher Hinsicht falsch. Es gibt keine Methode wie delete. Die Unterschiede bestehen darin, dass popder Wert zurückgegeben wird und dass dies delfür Slices funktioniert. In Fällen, in denen popfunktioniert, delhat genau die gleiche Rechenkomplexität (und ist durch einen konstanten Term etwas schneller).
Abarnert
1

Der Entfernungsvorgang für eine Liste erhält einen zu entfernenden Wert. Es durchsucht die Liste nach einem Element mit diesem Wert und löscht das erste übereinstimmende Element, das es findet. Es ist ein Fehler, wenn kein übereinstimmendes Element vorhanden ist, und löst einen ValueError aus .

>>> x = [1, 0, 0, 0, 3, 4, 5]
>>> x.remove(4)
>>> x
[1, 0, 0, 0, 3, 5]
>>> del x[7]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[7]
IndexError: list assignment index out of range

Mit der del- Anweisung kann eine gesamte Liste gelöscht werden. Wenn Sie ein bestimmtes Listenelement als Argument für del haben (z. B. Listenname [7], um speziell auf das 8. Element in der Liste zu verweisen), wird dieses Element einfach gelöscht. Es ist sogar möglich, ein "Slice" aus einer Liste zu löschen. Es ist ein Fehler, wenn der Index außerhalb des Bereichs liegt und einen IndexError auslöst .

>>> x = [1, 2, 3, 4]
>>> del x[3]
>>> x
[1, 2, 3]
>>> del x[4]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[4]
IndexError: list assignment index out of range

Die übliche Verwendung von Pop besteht darin, das letzte Element aus einer Liste zu löschen, während Sie die Liste als Stapel verwenden. Im Gegensatz zu del gibt pop den Wert zurück, den es aus der Liste entfernt hat. Sie können Pop und Pop optional einen anderen Indexwert als das Ende der Liste zuweisen (z. B. listname.pop (0) löscht das erste Element aus der Liste und gibt das erste Element als Ergebnis zurück). Sie können dies verwenden, damit sich die Liste wie eine Warteschlange verhält. Es stehen jedoch Bibliotheksroutinen zur Verfügung, mit denen Warteschlangenoperationen eine bessere Leistung erzielen können als pop (0). Es ist ein Fehler, wenn der Index außerhalb des Bereichs liegt und einen IndexError auslöst .

>>> x = [1, 2, 3] 
>>> x.pop(2) 
3 
>>> x 
[1, 2]
>>> x.pop(4)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    x.pop(4)
IndexError: pop index out of range

Weitere Informationen finden Sie unter collection.deque .

Kushan Gunasekera
quelle
-1

Entfernen funktioniert grundsätzlich am Wert. Löschen und Pop-Arbeiten am Index

Entfernen entfernt im Grunde den ersten übereinstimmenden Wert. Löschen löscht das Element aus einem bestimmten Index. Pop nimmt grundsätzlich einen Index und gibt den Wert an diesem Index zurück. Wenn Sie das nächste Mal die Liste drucken, wird der Wert nicht angezeigt.

Beispiel:

Harshal SG
quelle
3
Obwohl wir uns für Ihre Antwort bedanken, wäre es besser, wenn sie zusätzlich zu den anderen Antworten einen zusätzlichen Wert liefern würde. In diesem Fall bietet Ihre Antwort keinen zusätzlichen Wert, da andere Benutzer alles abdeckten, was Sie in Ihre Antwort aufgenommen haben. Als sekundäres Problem fügen Sie bitte keinen Text als Bilder ein, wenn Sie ihn als Text einfügen könnten. Wenn eine vorherige Antwort für Sie hilfreich war, sollten Sie sie abstimmen .
David Buck
-3

Sie können auch entfernen verwenden, um einen Wert auch nach Index zu entfernen.

n = [1, 3, 5]

n.remove(n[1])

n würde sich dann auf [1, 5] beziehen

max runia
quelle
43
Versuchen Sie es n = [5, 3, 5]dann n.remove(n[2]).
abarnert
@abarnert Ihr Anwendungsfall funktioniert synchron mit dem folgenden Fall n = [5,3,5], dann n.remove (5). Beide entfernen das erste angetroffene Element aus der Liste.
Akhil Ghatiki
@AkhilGhatiki n.remove(n[2])entfernt n[0], nicht n[2]. Es ist also nicht nur lineare Zeit ohne Grund (vielleicht keine große Sache, wenn N = 3), es ist auch falsch (eine große Sache, egal was N ist)
abarnert