In Python remove()
wird das erste Vorkommen von Wert in einer Liste entfernt.
Wie entferne ich alle Vorkommen eines Wertes aus einer Liste?
Das habe ich vor:
>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]
Funktionsansatz:
Python 3.x.
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]
oder
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter(lambda a: a != 2, x))
[1, 3, 3, 4]
Python 2.x.
>>> x = [1,2,3,2,2,2,3,4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]
[y for y in x if y != 2]
__ne__
. Das Vergleichen zweier Werte ist weitaus komplexer als nur das Aufrufen__eq__
oder Aufrufen__ne__
eines dieser Werte . Hier funktioniert es möglicherweise richtig, weil Sie nur Zahlen vergleichen, aber im Allgemeinen ist das falsch und ein Fehler.Sie können ein Listenverständnis verwenden:
quelle
in
Operator als auch dieremove
Methode die gesamte Liste (bis sie eine Übereinstimmung finden), sodass Sie die Liste auf diese Weise mehrmals scannen.Sie können die Slice-Zuweisung verwenden, wenn die ursprüngliche Liste geändert werden muss, während Sie dennoch ein effizientes Listenverständnis (oder einen Generatorausdruck) verwenden.
quelle
x = [ v for v in x if x != 2 ]
Vorschlägen, bei denen eine neue Liste erstellt und x geändert wird, um darauf zu verweisen, wobei die ursprüngliche Liste unberührt bleibt.Wiederholen Sie die Lösung des ersten Beitrags abstrakter:
quelle
x = [1] * 10000 + [2] * 1000
. Der Schleifenkörper wird 1000 Mal ausgeführt und .remove () muss bei jedem Aufruf 10000 Elemente überspringen. Das riecht für mich nach O (n * n), ist aber kein Beweis. Ich denke, der Beweis wäre anzunehmen, dass die Anzahl der 2s in der Liste proportional zu ihrer Länge ist. Dieser Proportionalitätsfaktor verschwindet dann in der Big-O-Notation. Der beste Fall von nur einer konstanten Anzahl von 2s in der Liste ist jedoch nicht O (n ^ 2), sondern nur O (2n), was O (n) ist.Siehe die einfache Lösung
Dies gibt eine Liste mit allen Elementen von
x
ohne zurück2
quelle
Alle obigen Antworten (mit Ausnahme von Martin Anderssons) erstellen eine neue Liste ohne die gewünschten Elemente, anstatt die Elemente aus der ursprünglichen Liste zu entfernen.
Dies kann wichtig sein, wenn Sie andere Verweise auf die Liste haben.
Verwenden Sie eine solche Methode, um die Liste zu ändern
Was die Geschwindigkeit betrifft, sind die Ergebnisse auf meinem Laptop (alle auf einer 5000-Eintragsliste mit 1000 entfernten Einträgen).
Die .remove-Schleife ist also ungefähr 100x langsamer ........ Hmmm, vielleicht ist ein anderer Ansatz erforderlich. Am schnellsten habe ich das Listenverständnis verwendet, aber dann den Inhalt der ursprünglichen Liste ersetzt.
quelle
def remove_all(x, l): return [y for y in l if y != x]
dannl = remove_all(3,l)
du kannst das
quelle
Auf Kosten der Lesbarkeit denke ich, dass diese Version etwas schneller ist, da sie die Zeit nicht zwingt, die Liste erneut zu überprüfen, und daher genau die gleiche Arbeit erledigt, die das Entfernen sowieso tun muss:
quelle
Numpy Ansatz und Timings gegen eine Liste / ein Array mit 1.000.000 Elementen:
Timings:
Fazit: Numpy ist 27-mal schneller (auf meinem Notebook) als der Ansatz des Listenverständnisses
PS, wenn Sie Ihre reguläre Python-Liste
lst
in ein Numpy-Array konvertieren möchten:Installieren:
Prüfen:
quelle
quelle
So entfernen Sie alle doppelten Vorkommen und lassen eines in der Liste:
Hier ist die Funktion, die ich für Project Euler verwendet habe:
quelle
Ich glaube, dies ist wahrscheinlich schneller als jede andere Möglichkeit, wenn Sie sich nicht um die Reihenfolge der Listen kümmern. Wenn Sie sich um die endgültige Reihenfolge kümmern, speichern Sie die Indizes des Originals und greifen Sie darauf zurück.
quelle
Viel einfacher glaube ich.
quelle
Lassen
Die einfachste und effizienteste Lösung, wie bereits erwähnt, ist
Eine andere Möglichkeit, die weniger Speicher verbrauchen sollte, aber langsamer ist, ist
Timing-Ergebnisse für Listen mit einer Länge von 1000 und 100000 mit 10% übereinstimmenden Einträgen: 0,16 vs 0,25 ms und 23 vs 123 ms.
quelle
Entfernen Sie alle Vorkommen eines Werts aus einer Python-Liste
Ergebnis:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
Alternative,
Ergebnis:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
quelle
Wenn Sie nicht eingebaut waren
filter
oder keinen zusätzlichen Platz benötigen und eine lineare Lösung benötigen ...quelle
['Hallo Welt']
quelle
Ich habe das nur für eine Liste gemacht. Ich bin nur ein Anfänger. Ein etwas fortgeschrittener Programmierer kann sicherlich eine solche Funktion schreiben.
quelle
Wir können auch alle vor Ort entfernen, indem wir entweder
del
oderpop
:Nun zur Effizienz:
Wie wir sehen, benötigt die In-Place-Version
remove_values_from_list()
keinen zusätzlichen Speicher, aber die Ausführung dauert viel länger:quelle
Niemand hat eine optimale Antwort für die zeitliche und räumliche Komplexität veröffentlicht, daher dachte ich, ich würde es versuchen. Hier ist eine Lösung, die alle Vorkommen eines bestimmten Werts entfernt, ohne ein neues Array zu erstellen, und dies zu einem effizienten Zeitpunkt. Der Nachteil ist, dass die Elemente die Reihenfolge nicht aufrechterhalten .
Zeitliche Komplexität: O (n)
Zusätzliche räumliche Komplexität: O (1)
quelle
Über die Geschwindigkeit!
quelle
Nur mit Python 3
quelle
Was ist falsch mit:
Mit Anakonda
quelle