map(function, iterable, ...)
Wenden Sie die Funktion auf jedes iterierbare Element an und geben Sie eine Liste der Ergebnisse zurück. Wenn zusätzliche iterierbare Argumente übergeben werden, muss die Funktion so viele Argumente annehmen und wird parallel auf die Elemente aller iterierbaren Argumente angewendet.
Wenn eine Iterable kürzer als eine andere ist, wird angenommen, dass sie um Keine Elemente erweitert wird.
Wenn Funktion ist None
, wird die Identitätsfunktion angenommen; Wenn mehrere Argumente vorhanden sind, wird map()
eine Liste zurückgegeben, die aus Tupeln besteht, die die entsprechenden Elemente aus allen iterablen Elementen enthalten (eine Art Transponierungsoperation).
Die iterierbaren Argumente können eine Sequenz oder ein beliebiges iterierbares Objekt sein. Das Ergebnis ist immer eine Liste.
Welche Rolle spielt dies bei der Herstellung eines kartesischen Produkts?
content = map(tuple, array)
Welchen Effekt hat es, irgendwo ein Tupel zu platzieren? Mir ist auch aufgefallen, dass die Ausgabe ohne die Kartenfunktion ist abc
und damit auch a, b, c
.
Ich möchte diese Funktion vollständig verstehen. Die Referenzdefinitionen sind ebenfalls schwer zu verstehen. Zu viel ausgefallener Flaum.
quelle
map
?map(None, a, b, c)
sich herausstelltzip(a, b, c)
. In der Praxis sieht man das jedoch sehr selten, gerade weil derzip
Anruf gleichwertig ist.tuple
ist eine Funktion (nun, sie ist nuancierter als diese, aber sie verhält sich wie eine Funktion), die eine Iterierbarkeit annimmt und Ihnen ein Tupel mit denselben Elementen gibt -tuple([1, 2, 3])
entspricht also(1, 2, 3)
. Dennmap(tuple, array)
,array
wäre ein iterable von Iterables (eine Liste von Listen denken), und es gibt Ihnen jede innere Liste in ein Tupel zurückgedreht.Antworten:
map
ist nicht besonders pythonisch. Ich würde stattdessen empfehlen, Listenverständnisse zu verwenden:ist im Grunde gleichbedeutend mit:
map
Ein kartesisches Produkt allein kann nicht hergestellt werden, da die Länge der Ausgabeliste immer der Länge der Eingabeliste entspricht. Sie können ein kartesisches Produkt mit einem Listenverständnis trivial ausführen:Die Syntax ist etwas verwirrend - das entspricht im Grunde:
quelle
map
viel weniger ausführlich als Listenverständnisse, zumindest für den Fall, den Sie demonstrieren.map
Äquivalent von[v.__name__ for v in (object, str)]
?map(lambda v: v.__name__, list)
?map
war manchmal schneller als Comprehensions, manchmal nicht, gerade wegen des Funktionsaufruf Overhead? Die Heuristik, die ich gelernt habe, ist insbesondere, dass dasmap
Verständnis schneller ist, wenn Sie einen zusätzlichen Funktionsaufruf einführen müssen. ZB wurde ich zu der Überzeugung gebracht, dass diesmap(lambda foo: foo.bar, my_list)
langsamer alsfoo.bar for foo in my_list
und sogarmap(operator.add, my_list_of_pairs)
langsamer alsx + y for x, y in my_list_of_pairs
genau wegen des zusätzlichen Funktionsaufrufs ist.map
bezieht sich überhaupt nicht auf ein kartesisches Produkt, obwohl ich mir vorstelle, dass jemand, der sich mit funktionaler Programmierung auskennt, einen unmöglich zu verstehenden Weg finden könnte, ein Produkt mit zu erzeugenmap
.map
in Python 3 entspricht dem:und der einzige Unterschied in Python 2 besteht darin, dass eine vollständige Liste der Ergebnisse erstellt wird, die alle auf einmal zurückgeben, anstatt
yield
ing.Obwohl die Python-Konvention normalerweise Listenverständnisse (oder Generatorausdrücke) bevorzugt, um das gleiche Ergebnis wie bei einem Aufruf zu erzielen
map
, insbesondere wenn Sie einen Lambda-Ausdruck als erstes Argument verwenden:Als Beispiel für das, was Sie in den Kommentaren zu der Frage "Verwandle einen String in ein Array" gefragt haben, möchten Sie mit "Array" wahrscheinlich entweder ein Tupel oder eine Liste (beide verhalten sich ein wenig wie Arrays aus anderen Sprachen). - -
Eine Verwendung von
map
hier wäre, wenn Sie mit einer Liste von Zeichenfolgen anstelle einer einzelnen Zeichenfolge beginnen -map
können Sie alle einzeln auflisten:Beachten Sie, dass
map(list, a)
dies in Python 2 äquivalent ist, aber in Python 3 benötigen Sie denlist
Aufruf, wenn Sie etwas anderes tun möchten, als ihn in einefor
Schleife einzuspeisen (oder eine Verarbeitungsfunktion wiesum
diese benötigt nur eine iterierbare und keine Sequenz). Beachten Sie aber auch noch einmal, dass ein Listenverständnis normalerweise bevorzugt wird:quelle
map
Erstellt eine neue Liste, indem auf jedes Element der Quelle eine Funktion angewendet wird:n-ary
map
entspricht dem gemeinsamen Zippen von Eingabeiterablen und dem anschließenden Anwenden der Transformationsfunktion auf jedes Element dieser gezippten Zwischenliste. Es ist kein kartesisches Produkt:Ich habe es
zip
hier verwendet, aber dasmap
Verhalten unterscheidet sich geringfügig, wenn iterables nicht dieselbe Größe haben. Wie in der Dokumentation angegeben, werden iterables erweitertNone
.quelle
[2,4,6]
dem Listenverständnis und den expliziten Schleifen, aber die Karte gibt ein Kartenobjekt zurück - zum Beispiel bekomme ich folgendes:<map at 0x123a49978>
Was ich dann in eine Liste zwingen muss.Wenn Sie es ein wenig vereinfachen, können Sie sich vorstellen
map()
, so etwas zu tun:Wie Sie sehen können, werden eine Funktion und eine Liste verwendet und eine neue Liste zurückgegeben, mit dem Ergebnis, dass die Funktion auf jedes der Elemente in der Eingabeliste angewendet wird. Ich sagte : „Vereinfachung ein wenig“ , denn in Wirklichkeit
map()
verarbeiten kann mehr als ein iterable:Für den zweiten Teil der Frage: Welche Rolle spielt dies bei der Herstellung eines kartesischen Produkts? Nun,
map()
könnte verwendet werden, um das kartesische Produkt einer Liste wie dieser zu erzeugen:... Aber um die Wahrheit zu sagen, ist die Verwendung
product()
eine viel einfachere und natürlichere Methode, um das Problem zu lösen:In jedem Fall ist das Ergebnis das kartesische Produkt
lst
wie oben definiert:quelle
Die
map()
Funktion dient dazu, auf jedes Element in einer iterierbaren Datenstruktur wie Listen, Generatoren, Zeichenfolgen und andere Elemente dieselbe Prozedur anzuwenden.Schauen wir uns ein Beispiel an:
map()
Kann jedes Element in einer Liste durchlaufen und eine Funktion auf jedes Element anwenden, dann wird die neue Liste zurückgegeben (Sie erhalten sie zurück).Stellen Sie sich vor, Sie haben eine Funktion, die eine Zahl nimmt, dieser Zahl 1 hinzufügt und sie zurückgibt:
Sie haben auch eine Liste von Nummern:
Wenn Sie jede Zahl in der Liste erhöhen möchten, können Sie Folgendes tun:
Hinweis: Benötigt mindestens
map()
zwei Argumente. Erstens ein Funktionsname und zweitens so etwas wie eine Liste.Mal sehen, was andere coole Dinge
map()
können.map()
Sie können mehrere Iterables (Listen, Zeichenfolgen usw.) verwenden und ein Element von jedem Iterable als Argument an eine Funktion übergeben.Wir haben drei Listen:
map()
Sie können eine neue Liste erstellen, in der Elemente an einem bestimmten Index hinzugefügt werden.Denken Sie jetzt daran
map()
, braucht eine Funktion. Dieses Mal verwenden wir die eingebautesum()
Funktion. Laufenmap()
ergibt folgendes Ergebnis:ERINNERN SIE SICH:
In Python 2
map()
wird gemäß der längsten Liste iteriert (die Elemente der Listen durchlaufen) undNone
an die Funktion für die kürzeren Listen übergeben, sodass Ihre Funktion diese suchenNone
und verarbeiten sollte, da sonst Fehler auftreten. In Python wird 3 beendetmap()
, nachdem die kürzeste Liste abgeschlossen wurde. Gibt in Python 3 auchmap()
einen Iterator zurück, keine Liste.quelle
Python3 - Karte (func, iterierbar)
Eine Sache, die nicht vollständig erwähnt wurde (obwohl @BlooB es irgendwie erwähnt hat), ist, dass map ein Kartenobjekt zurückgibt, KEINE Liste. Dies ist ein großer Unterschied in Bezug auf die Zeitleistung bei der Initialisierung und Iteration. Betrachten Sie diese beiden Tests.
Wie Sie sehen, dauert die Initialisierung der Kartenfunktion fast gar nicht. Das Durchlaufen des Kartenobjekts dauert jedoch länger als das einfache Durchlaufen des iterierbaren Objekts. Dies bedeutet, dass die an map () übergebene Funktion nicht auf jedes Element angewendet wird, bis das Element in der Iteration erreicht ist. Wenn Sie eine Liste wünschen, verwenden Sie das Listenverständnis. Wenn Sie vorhaben, in einer for-Schleife zu durchlaufen und irgendwann abbrechen, verwenden Sie map.
quelle