Ich habe mich gefragt, ob es in Python Möglichkeiten gibt, Sammlungen zu ändern, ohne neue zu erstellen. Zum Beispiel:
%Vor% Funktioniert einwandfrei, aber es wird eine neue Sammlung erstellt. Gibt es einen Grund, dass Python-Sammlungen eine filter()
-Methode (oder Ähnliches) fehlt, die das Sammelobjekt an Ort und Stelle ändern würde?
Die anderen Antworten sind korrekt; Wenn Sie möchten, dass alle Namen, die auf die alte Liste verweisen, auf die neue Liste verweisen, können Sie die Slice-Zuweisung verwenden.
Allerdings ist das nicht wirklich an Ort und Stelle. Die neue Liste wird zuerst an anderer Stelle erstellt. Der Link in Svens Antwort ist gut.
Der Grund es gibt keinen, der wirklich an Ort und Stelle arbeitet, ist, dass, während eine neue Liste wie diese erstellt wird, O (n), jede wirklich in-place Elemententfernung O (k ) für sich , wobei k
die Länge der Liste vom Entfernungspunkt an angibt. Der einzige Weg, dies mit Python-Listen zu vermeiden, ist die Verwendung von temporärem Speicher, was Sie mit der Slice-Zuweisung tun.
Ein Beispiel für einen In-Place-O (n) -Filter in collections.deque
, falls Sie Ihre Daten nicht in list
:
Wenn Sie dies an Ort und Stelle tun möchten, verwenden Sie einfach
%Vor%Dies wird nicht schneller sein oder Speicher speichern , aber es ändert das Objekt an Ort und Stelle, wenn dies die Semantik ist, die Sie brauchen.
Die lst[:]
Lösung von @Sven Marnach ist eine Option. Sie können diese Operation auch direkt ausführen, indem Sie mit
... aber diese Lösung ist nicht sehr gut lesbar und benötigt aufgrund der gesamten Elementverschiebung quadratische Zeit.
Korrigieren @larsmans ursprüngliche Lösung , Sie konnten entweder tun
%Vor%oder
%Vor% Grund ist die "Indexverschiebung", die mit del
passiert. Wenn ich del
an einem Keratin-Index habe, muss ich diesen Index erneut untersuchen, weil er jetzt einen anderen Wert hat.
Tags und Links python collections