Gibt es ein In-Place-Äquivalent zu "map" in Python?

9

Ich habe eine Liste von Strings, die ich bereinigen muss. Ich habe eine Methode, sie zu bereinigen, also könnte ich einfach tun:

%Vor%

aber ich muss die alte Liste nicht behalten. Das hat mich gewundert, ob es eine In-Place-Entsprechung zur Karte gibt. Einfach genug, um dafür eine for-Schleife zu schreiben (oder eine benutzerdefinierte In-Place-Map-Methode), aber ist irgendetwas eingebaut?

    
Herms 10.11.2010, 19:41
quelle

4 Antworten

8

Die Antwort ist einfach: Nein.

Fragen der Form "does XXX exist" werden niemals direkt beantwortet, wenn die Antwort no ist, also dachte ich mir, ich würde es da draußen veröffentlichen.

Die meisten helpers und builtins von ibertools arbeiten mit generischen Iteratoren. map , filter , list comprehensions, for - sie arbeiten alle an Iteratoren und modifizieren den ursprünglichen Container (falls vorhanden) nicht.

Warum gibt es in dieser Kategorie keine mutierenden Funktionen? Weil es keine generische, universelle Möglichkeit gibt, Containern Werte in Bezug auf ihre Schlüssel und Werte zuzuweisen. Zum Beispiel durchlaufen einfache dict-Iteratoren ( for x in {} ) die Schlüssel und die Zuweisung zu einem dict verwendet das Ergebnis des dict als Parameter für []. Listen hingegen iterieren über die -Werte und die Zuweisung verwendet den impliziten Index. Die zugrundeliegende Konsistenz ist nicht dazu da, generische Funktionen wie diese bereitzustellen, also gibt es nichts Vergleichbares in itertools oder in den Builtins.

Sie könnten es als Methoden von list und dict bereitstellen, aber momentan tun sie es nicht. Sie müssen nur Ihre eigenen rollen.

    
Glenn Maynard 10.11.2010, 20:00
quelle
5

Sie müssen Schleife:

%Vor%

Es ist nichts eingebaut.

Wie in den Kommentaren vorgeschlagen: Eine vom OP gewünschte Funktion:

%Vor%     
Ned Batchelder 10.11.2010 20:00
quelle
2

Am Ende des Tages

%Vor%

wird genau das tun, was Sie brauchen.

Sie könnten einwenden, dass das Erstellen eines neuen Listenobjekts und das Sammeln des alten Listenobjekts langsamer ist als das Verwenden eines vorhandenen Listenobjekts. In der Praxis sollte dies fast nie ein Problem sein (es ist unwahrscheinlich, dass die Zuordnung als einzelner Speicherbereich ein Flaschenhals ist; vielleicht, wenn Sie dies in einer Schleife tun oder eine sehr lange Liste haben, könnten Sie Benchmarking versuchen, aber ich würde immer noch gegen dich wetten). Denken Sie daran, dass Sie auf jeden Fall neue Zeichenfolgen als Teil von Sanitize erstellen müssen, und das wird sehr viel teurer.

Bemerkenswert, wie mluebke anmerkt, ist, dass diese Tage Listenkomprehensionen viel mehr "pythonisch" als map (ich glaube, dass map in zukünftigen Versionen der Sprache veraltet ist) betrachtet werden.

Edit: Ah, ich sehe, dass Sie versuchen, die Werte von Argumenten zu bearbeiten, die an eine Funktion übergeben werden. Ich würde ziemlich stark argumentieren, dass dies "unpythonisch" ist und dass Sie die neue Liste als einen Ihrer Rückgabewerte zurückgeben sollten (denken Sie daran, dass Sie mit Tupeln mehr als einen Rückgabewert haben können).

    
YGA 10.11.2010 19:46
quelle
0

Ähnlich wie bei der Verwendung von this[0] = something können Sie auch Slices angeben:

%Vor%

Da in Slices Teile weggelassen werden können (Start, Stopp oder Schritt), können Sie die gesamte Liste in etwa wie folgt ändern:

%Vor%

Dies (wie oben gesehen) ist in der Lage, sogar die Länge der Liste zu ändern. Wie unten zu sehen ist, ändert dies tatsächlich das tatsächliche Objekt und definiert die Variable nicht neu:

%Vor%

Es muss nicht unbedingt eine Liste am rechten Ende der Aufgabe sein. Alles, was iterierbar ist, kann auf dieser Seite sein. Tatsächlich könnte man sogar einen Generator haben:

%Vor%

oder die Rückgabe von map() (eine Liste in Python 2; ein map -Objekt in Python 3):

%Vor%     
zondo 30.06.2016 04:57
quelle

Tags und Links