Ist es möglich, mehrere Elemente gleichzeitig aus einer Liste zu löschen? Wenn ich Elemente bei Index 0 und 2 löschen und etwas wie versuchen möchte del somelist[0]
, gefolgt von del somelist[2]
, wird die zweite Anweisung tatsächlich gelöscht somelist[3]
.
Ich denke, ich könnte immer zuerst die höher nummerierten Elemente löschen, aber ich hoffe, es gibt einen besseren Weg.
somelist = [ lst[i] for i in xrange(len(lst)) if i not in set(indices) ]
?Aus irgendeinem Grund mag ich keine der Antworten hier. Ja, sie funktionieren, aber genau genommen löschen die meisten von ihnen keine Elemente in einer Liste, oder? (Erstellen Sie jedoch eine Kopie und ersetzen Sie die Originalkopie durch die bearbeitete Kopie.)
Warum nicht einfach zuerst den höheren Index löschen?
Gibt es einen Grund dafür? Ich würde einfach tun:
Wenn Sie Elemente wirklich nicht rückwärts löschen möchten, sollten Sie die Indexwerte, die größer als der zuletzt gelöschte Index sind (Sie können nicht denselben Index verwenden, da Sie eine andere Liste haben), einfach inkrementieren oder verwenden eine Kopie der Liste (die nicht "löschen", sondern das Original durch eine bearbeitete Kopie ersetzen würde).
Vermisse ich hier etwas, einen Grund, NICHT in umgekehrter Reihenfolge zu löschen?
quelle
Wenn Sie mehrere nicht benachbarte Elemente löschen, ist das, was Sie beschreiben, der beste Weg (und ja, beginnen Sie unbedingt mit dem höchsten Index).
Wenn Ihre Elemente nebeneinander liegen, können Sie die Slice-Zuweisungssyntax verwenden:
quelle
del a[2:10]
mit dem gleichen Effekt sagen .Sie können
numpy.delete
wie folgt verwenden:Wenn es Ihnen nichts ausmacht,
numpy
am Ende ein Array zu haben, können Sie das weglassen.tolist()
. Sie sollten auch einige ziemlich große Geschwindigkeitsverbesserungen sehen, was diese Lösung skalierbarer macht. Ich habe es nicht bewertet, abernumpy
Operationen sind kompilierter Code, der entweder in C oder Fortran geschrieben ist.quelle
Als Spezialisierung von Gregs Antwort können Sie sogar die erweiterte Slice-Syntax verwenden. z.B. Wenn Sie die Elemente 0 und 2 löschen möchten:
Dies deckt natürlich keine willkürliche Auswahl ab, kann aber durchaus zum Löschen von zwei beliebigen Elementen verwendet werden.
quelle
Als eine Funktion:
Läuft in n log (n) Zeit, was es zur schnellsten richtigen Lösung machen sollte.
quelle
n log n
? "Ja wirklich?" Ich glaube nicht, dassdel list[index]
es O (1) ist.Sie möchten also im Wesentlichen mehrere Elemente in einem Durchgang löschen? In diesem Fall wird die Position des nächsten zu löschenden Elements um die Anzahl der zuvor gelöschten Elemente versetzt.
Unser Ziel ist es, alle Vokale zu löschen, die als Indizes 1, 4 und 7 vorberechnet wurden. Beachten Sie, dass die to_delete-Indizes in aufsteigender Reihenfolge wichtig sind, da sie sonst nicht funktionieren.
Es wäre komplizierter, wenn Sie die Elemente in beliebiger Reihenfolge löschen möchten. IMO, das Sortieren ist
to_delete
möglicherweise einfacher, als herauszufinden, wann Sie subtrahieren sollten oder nichtindex
.quelle
Ich bin ein absoluter Anfänger in Python, und meine Programmierung ist im Moment, gelinde gesagt, grob und schmutzig, aber meine Lösung bestand darin, eine Kombination der grundlegenden Befehle zu verwenden, die ich in frühen Tutorials gelernt habe:
Dies hat natürlich seine Grenzen, da ein Zeichen zum Löschen markiert werden muss.
Was die Leistung angeht, da die Größe der Liste skaliert, bin ich sicher, dass meine Lösung nicht optimal ist. Es ist jedoch unkompliziert, was hoffentlich andere Anfänger anspricht, und funktioniert in einfachen Fällen, in denen
some_list
es ein bekanntes Format hat, z. B. immer numerisch ...quelle
Hier ist eine Alternative, bei der enumerate () nicht zum Erstellen von Tupeln verwendet wird (wie in der ursprünglichen Antwort von SilentGhost).
Dies scheint mir lesbarer zu sein. (Vielleicht würde ich mich anders fühlen, wenn ich es gewohnt wäre, Aufzählungen zu verwenden.) CAVEAT: Ich habe die Leistung der beiden Ansätze nicht getestet.
HINWEIS: Python 2.7-Syntax. Für Python 3
xrange
=>range
.Verwendung:
Somelist:
--- BONUS ---
Löschen Sie mehrere Werte aus einer Liste. Das heißt, wir haben die Werte, die wir löschen möchten:
Verwendung:
Somelist:
Dies ist die gleiche Antwort wie zuvor, aber diesmal haben wir die zu löschenden WERTE angegeben
[0, 44, 55]
.quelle
[ value for (i, value) in enumerate(lst) if i not in set(indices) ]
. Aber ich werde meine Antwort hier lassen, weil ich auch zeige, wie man nach Werten löscht. Das ist ein einfacher Fall, könnte aber jemandem helfen.indices_as_set = set(indices)
,[ value for (i, value) in enumerate(lst) if i not in indices_as_set ]
es zu beschleunigen.delete__by_values()
?Eine alternative Methode zum Verständnis von Listen, die Listenindexwerte verwendet:
Dies gibt zurück:
quelle
index
irreführend zu bezeichnen, da im Listeniterator die Methode verwendet wirdindex()
Hier ist eine andere Methode, mit der die Elemente entfernt werden. Auch wenn Ihre Liste wirklich lang ist, ist sie schneller.
quelle
Dies wurde erwähnt, aber irgendwie hat es niemand geschafft, es richtig zu machen.
Eine
O(n)
Lösung wäre:Dies kommt der Version von SilentGhost sehr nahe , fügt jedoch zwei geschweifte Klammern hinzu.
quelle
O(n)
der Fall, wenn Sie die Suchvorgänge zählen, dielog(len(indices))
für jede Iteration erforderlich sind.j not in indices
istO(1)
.j not in indices
immer noch eine Suche erforderlichO(log(len(indices)))
. Ich bin zwar damit einverstanden, dass eine Suche in einem 2-Elemente-Satz als qualifiziert giltO(1)
, im allgemeinen Fall jedochO(log(N))
. So oder soO(N log(N))
schlägt immer nochO(N^2)
.j not in indices
istO(1)
im Ernst.Es ist im Grunde das Gleiche wie die am häufigsten gewählte Antwort, nur eine andere Art, sie zu schreiben. Beachten Sie, dass die Verwendung von l.index () keine gute Idee ist, da doppelte Elemente in einer Liste nicht verarbeitet werden können.
quelle
Die Methode "Entfernen" führt zu einer starken Verschiebung der Listenelemente. Ich denke, es ist besser, eine Kopie zu machen:
quelle
Technisch gesehen lautet die Antwort NEIN. Es ist nicht möglich, zwei Objekte gleichzeitig zu löschen. Es ist jedoch möglich, zwei Objekte in einer Zeile schöner Python zu löschen.
wird recusrively löschen
foo['bar']
, dannfoo['baz']
quelle
Wir können dies tun, indem wir eine for-Schleife verwenden, die über die Indizes iteriert, nachdem die Indexliste in absteigender Reihenfolge sortiert wurde
quelle
Für die Indizes 0 und 2 aus Liste A:
Für einige zufällige Indizes, die aus listA entfernt werden sollen:
quelle
Ich wollte einen Weg finden, die verschiedenen Lösungen zu vergleichen, die es einfach machten, die Knöpfe zu drehen.
Zuerst habe ich meine Daten generiert:
Dann habe ich meine Funktionen definiert:
Dann habe ich
timeit
die Lösungen verglichen:Ausgabe
Der Generator mit den Indizes in a
set
war also der Gewinner. Unddel
ist dann etwas schnellerpop
.quelle
Sie können diese Logik verwenden:
quelle
Eine weitere Umsetzung der Idee, aus dem höchsten Index zu entfernen.
quelle
Ich kann mir zwei Möglichkeiten vorstellen:
Schneiden Sie die Liste wie folgt auf (dies löscht das 1., 3. und 8. Element)
Somelist = Somelist [1: 2] + Somelist [3: 7] + Somelist [8:]
Tun Sie das an Ort und Stelle, aber nacheinander:
somelist.pop (2) somelist.pop (0)
quelle
Sie können dies auf einem Diktat tun, nicht auf einer Liste. In einer Liste sind die Elemente der Reihe nach. In einem Diktat hängen sie nur vom Index ab.
Einfacher Code, um es zu erklären, indem Sie Folgendes tun :
Eine Möglichkeit, eine Liste in ein Diktat zu "konvertieren", ist:
Das Gegenteil ist:
Wie auch immer, ich denke, es ist besser, mit dem Löschen aus dem höheren Index zu beginnen, wie Sie sagten.
quelle
Um den Kommentar von @sth zu verallgemeinern . Das Löschen von Elementen in jeder Klasse, die abc.MutableSequence implementiert , und
list
insbesondere erfolgt über die__delitem__
magische Methode. Diese Methode funktioniert ähnlich wie__getitem__
, dh sie kann entweder eine Ganzzahl oder ein Slice akzeptieren. Hier ist ein Beispiel:Dies wird ausgegeben
quelle
Das Importieren nur aus diesem Grund ist möglicherweise übertrieben, aber wenn Sie es
pandas
trotzdem verwenden, ist die Lösung einfach und unkompliziert:quelle
Vermeidet das Sortieren von Kosten und das explizite Kopieren der Liste.
quelle
Wie wäre es mit einem davon (ich bin sehr neu in Python, aber sie scheinen in Ordnung zu sein):
['Atlantik', 'Pazifik', 'Indianer']
['Atlantik', 'Pazifik', 'Indianer']
quelle
Keine der bisher angebotenen Antworten führt das Löschen in O (n) auf der Länge der Liste durch, damit eine beliebige Anzahl von Indizes gelöscht werden kann. Hier ist meine Version:
quelle
Sie können auch remove verwenden.
quelle
Ich habe alles zu einer
list_diff
Funktion zusammengefasst, die einfach zwei Listen als Eingaben verwendet und deren Differenz zurückgibt, wobei die ursprüngliche Reihenfolge der ersten Liste beibehalten wird.Beispielnutzung:
quelle