Wie können Python-Sammlungen durch direktes Filtern geändert werden?

8

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?

    
Zaur Nasibov 07.11.2011, 13:59
quelle

6 Antworten

7

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 :

speichern müssen %Vor%     
agf 07.11.2011, 14:05
quelle
17

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.

    
Sven Marnach 07.11.2011 14:01
quelle
1

Die lst[:] Lösung von @Sven Marnach ist eine Option. Sie können diese Operation auch direkt ausführen, indem Sie mit

konstanten zusätzlichen Speicher verwenden %Vor%

... aber diese Lösung ist nicht sehr gut lesbar und benötigt aufgrund der gesamten Elementverschiebung quadratische Zeit.

    
Fred Foo 07.11.2011 14:05
quelle
1

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.

    
glglgl 07.11.2011 14:21
quelle
0

Weil nicht benötigt .

%Vor%     
Ignacio Vazquez-Abrams 07.11.2011 14:02
quelle
0

Ich denke, es ist Transformation an Ort und Stelle;

%Vor%

Ergebnis

%Vor%     
eyquem 07.11.2011 17:12
quelle

Tags und Links