Gibt es ein direktes äquivalent auf 'Karte' in python?
Habe ich eine Liste von strings, die ich brauche, um zu desinfizieren. Ich habe eine Methode zur Hygienisierung von Ihnen, so konnte ich nur:
new_list = map(Sanitize, old_list)
aber das muss ich nicht wieder die alte Liste um. Dieser hat mich gefragt, ob es ein direktes äquivalent zu map. Leicht genug zu schreiben, eine for-Schleife (oder ein custom in-place-map-Methode), aber es ist alles eingebaut?
- Yep, das ist ein dup. Ich schwöre, ich habe gesucht, um zu sehen, ob dies wurde bereits gefragt. Anscheinend ist meine Suche-Fähigkeiten sind nicht gut genug. 🙂
- Nicht eine sinnvolle duplizieren, da diese Frage nicht beantwortet. Die alten Fragen sind kaum zu beantworten ist (es gibt keinen Weg, um "bump" - Fragen), so dass es nicht sinnvoll ist, dieses zu schließen als Duplikat. Schließen dupes wie, effektiv doom Sie nie beantwortet.
- Maynard, die gewählt sind, um in der Nähe, da gibt es jetzt eine Antwort.
- Nein, es gibt keine Antwort auf diese Frage in #3000461. Diese Frage wurde geschlossen, Fehler.
- Maynard Verdammt, du hast Recht. Stimmte zu öffnen und stimmten zu, in der Nähe der älteren.
- Diese noch schafft eine neue Liste, sondern verwendet den Verweis von old_list
old_list[:] = map(Sanitize, old_list)
- Eigentlich nicht in-place, aber seit der OP das eigentliche Ziel (ausgehend von Anmerkungen unten) zu sein scheint", stellen die Ergebnisse in die gleiche Liste, die der Anrufer" und nicht die Pflege so viel, ob es wirklich in-place, das ist wohl OK. Ich habe einige intuitiv zu zögern, obwohl; ich würde wohl nur noch eine Funktion schreiben, die tatsächlich tut Sie es in Stelle.
- Also etwas anderes, verweist auf die Liste sehen würde das ändern? Interessant.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort ist einfach: Nein.
Fragen der form "hat XXX vorhanden" nie neigen dazu, sich direkt beantwortet, wenn die Antwort ist keine, so dass ich dachte, ich würde es.
Meisten itertools Helfer und gelieferten arbeiten auf generische Iteratoren.
map
,filter
, Liste Verstehens,for
- Sie alle arbeiten mit Iteratoren, die nicht eine änderung der ursprünglichen container (wenn vorhanden).Warum gibt es keine mutierende Funktionen in dieser Kategorie? Weil es keine generische, Universelle Weg, um Werte zuzuweisen, um Container hinsichtlich Ihrer Schlüssel und Werte. Zum Beispiel basic-dict-Iteratoren (
for x in {}
) Iteration über die Schlüssel, und die Zuweisung an ein dict verwendet das Ergebnis des dict als parameter []. Listen, auf der anderen Seite, Durchlaufen die Werte und bei der Zuordnung verwendet die implizite index. Die zugrunde liegenden Konsistenz ist nicht da, um Allgemeine Funktionen wie diese, so gibt es nichts, wie dies initertools
oder in der gelieferten.Könnten Sie bieten es als Methoden der
list
unddict
sind, aber jetzt Sie nicht. Sie müssen nur Rollen Sie Ihre eigenen.Müssen Sie eine Schleife:
Da ist nichts eingebaut.
Als Vorschlag in den Kommentaren: eine Funktion wie gewünscht von der OP:
def map_in_place(func, a_list):
und wir haben eine vollständige Antwort. (Aberold_list = map(Sanitize, old_list)
, während es nicht mutieren die alte Liste, scheint die beste Lösung.)Am Ende des Tages,
erledigt genau das, was Sie brauchen.
Man mag einwenden, dass eine neue Liste zu erstellen-Objekt und garbage collecting die alte ist langsamer als eine vorhandene verwenden. In der Praxis sollte dies nahezu nie ein Problem ist (Zuweisung als ein-aus-ein Stück der Speicher ist unwahrscheinlich, dass ein Engpass; vielleicht, wenn Sie tun dies in einer Schleife oder haben eine enorm lange Liste, die Sie könnten versuchen, benchmarking, aber ich würde noch Wette gegen Sie). Denken Sie daran, dass jede Weise, die Sie haben, um neue strings von vorne als Teil der
Sanitize
- und das wird viel teurer.Erwähnenswert, als
mluebke
Hinweise, ist, dass in diesen Tagen die Liste Verstehens sind, als viel mehr "pythonic" alsmap
(ich glaubemap
veraltet ist, wird in zukünftigen Versionen der Sprache).Edit: Ah, ich sehe, Sie versuchen, Bearbeiten Sie die Werte der Argumente an eine Funktion übergeben. Ich würde ziemlich stark argumentieren, dass dies "unpythonic" und, dass Sie sollte die Rückkehr der neuen Liste als einer der Ihren return-Werte (denken Sie daran, mit Tupeln Sie können mehr als ein return-Wert).
Ähnlich wie mit
this[0] = something
Sie können auch angeben, Scheiben:Da die Scheiben können Teile ausgelassen (start, Stopp oder Schritt), können Sie die ganze Liste durch so etwas wie dieses:
Diese (wie oben gesehen) ist in der Lage verändert, selbst die Länge der Liste. Wie man unten sehen kann, ist dies in der Tat die änderung der tatsächlichen Objekt, nicht die Neudefinition der variable:
Es muss nicht unbedingt sein, eine Liste auf der rechten Seite der Zuweisung. Alles, was iterierbar ist, kann an dieser Seite. In der Tat könnte man sogar einen generator:
oder die Rückgabe von
map()
(eine Liste in Python 2; einmap
Objekt in Python 3):