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 Elemente angewendet.
Wenn ein Iterable kürzer als ein anderes ist, wird davon ausgegangen, dass es mit None-Elementen erweitert wird.
Wenn Funktion ist None, wird die Identitätsfunktion angenommen; wenn es mehrere Argumente gibt, map() gibt eine Liste zurück, die aus Tupeln besteht, die die entsprechenden Elemente aus allen Iterablen enthalten (eine Art Transpositionsoperation).
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 dort ein Tupel einzufügen? Mir ist auch aufgefallen, dass ohne die Kartenfunktion die Ausgabe erfolgt abc und damit ist es a, b, c.
Ich möchte diese Funktion vollständig verstehen. Die Referenzdefinitionen sind auch schwer zu verstehen. Zu viel schicker Flaum.
Was wollen Sie eigentlich erreichen und wofür wollen Sie konkret nutzen map?
– Kris Harper
11. Juni 2012 um 1:42 Uhr
@WebMaster ja, gemäß dem ersten Satz in der Dokumentation, die Sie eingefügt haben – “Funktion auf jedes iterierbare Element anwenden”. Der Rest des Absatzes befasst sich mit komplexeren Fällen – wie z map(None, a, b, c) erweist sich zu tun zip(a, b, c). Aber das sieht man in der Praxis sehr selten, gerade weil die zip Anruf ist gleichwertig.
– lvc
11. Juni 2012 um 2:11 Uhr
Ich bemühe mich sehr, Python zu lernen, und wann immer ich eine Definition in python.org eröffne. Nach dem ersten Satz verstehe ich nichts. In Ordnung. Danke.
– Webmaster
11. Juni 2012 um 2:18 Uhr
tuple ist eine Funktion (na ja, sie ist nuancierter als das, aber sie verhält sich wie eine Funktion), die ein Iterable nimmt und Ihnen ein Tupel mit denselben Elementen gibt – also tuple([1, 2, 3]) ist äquivalent zu (1, 2, 3). Zum map(tuple, array), array wäre ein Iterable von Iterables (denken Sie an eine Liste von Listen), und es gibt Ihnen jede innere Liste zurück, die in ein Tupel umgewandelt wurde.
– lvc
11. Juni 2012 um 2:26 Uhr
Im Allgemeinen ist der erste Satz der Dokumentation jeder Funktion am wichtigsten. Wenn du das verstehst, hast du das Wesentliche verstanden. Der Rest spezifiziert das Verhalten sehr detailliert und einiges davon Wille zu Beginn etwas undurchsichtig sein, und Sie müssen möglicherweise auf eine seltsame Redewendung stoßen, die darauf basiert, bevor Sie “oh, das ist was das bedeutet!”. Aber sobald Sie diesen Aha-Moment für ein paar Builtins bekommen haben, sollten Sie anfangen, die Dokumentation etwas leichter zu verstehen.
– lvc
11. Juni 2012 um 2:32 Uhr
dave
map ist nicht besonders pythonisch. Ich würde stattdessen die Verwendung von Listenverständnissen empfehlen:
map(f, iterable)
ist im Grunde gleichbedeutend mit:
[f(x) for x in iterable]
map allein kann kein kartesisches Produkt erstellen, da die Länge seiner Ausgabeliste immer gleich der Länge seiner Eingabeliste ist. Sie können jedoch trivialerweise ein kartesisches Produkt mit einem Listenverständnis erstellen:
[(a, b) for a in iterable_a for b in iterable_b]
Die Syntax ist etwas verwirrend – das ist im Grunde äquivalent zu:
result = []
for a in iterable_a:
for b in iterable_b:
result.append((a, b))
Ich finde Verwendung map viel weniger ausführlich als Listenverständnisse, zumindest für den Fall, den Sie demonstrieren.
– Marmor
14. Dezember 2016 um 16:40 Uhr
Wie verwende ich die Karte für Immobilien? Was ist der map-Äquivalent von [v.__name__ for v in (object, str)]?
– Eine Gr
19. Juli 2017 um 10:53 Uhr
@ASz Wie wäre es mit map(lambda v: v.__name__, list)?
– Kiljan
13. Oktober 2017 um 7:55 Uhr
map ist schneller, da es keine Funktionen basierend auf der Länge von Iteratoren aufruft. Das Aufrufen von Funktionen hat einen Overhead.. Uhr 6:00 youtube.com/watch?v=SiXyyOA6RZg&t=813s
– anati
22. November 2017 um 10:47 Uhr
@Anati, dachte ich map war manchmal schneller als Verständnis, manchmal nicht, gerade wegen des Funktionsaufruf-Overheads? Insbesondere die Heuristik, die ich gelernt habe, ist die beim Verwenden map erfordert, dass Sie einen zusätzlichen Funktionsaufruf einführen, ist das Verständnis schneller? Das wurde mir zB eingeredet map(lambda foo: foo.bar, my_list) ist langsamer als foo.bar for foo in my_listund das sogar map(operator.add, my_list_of_pairs) ist langsamer als x + y for x, y in my_list_of_pairsgerade wegen des zusätzlichen Funktionsaufrufs.
– mtraceur
20. Februar 2018 um 22:21 Uhr
lvc
map bezieht sich überhaupt nicht auf ein kartesisches Produkt, obwohl ich mir vorstelle, dass jemand, der sich mit funktionaler Programmierung auskennt, einen unmöglich verständlichen Weg finden könnte, eine Eins zu erzeugen map.
map in Python 3 ist äquivalent zu diesem:
def map(func, iterable):
for i in iterable:
yield func(i)
und der einzige Unterschied in Python 2 besteht darin, dass es eine vollständige Liste von Ergebnissen aufbaut, die alle auf einmal zurückgegeben werden yielding.
Obwohl die Python-Konvention normalerweise Listenverständnisse (oder Generatorausdrücke) bevorzugt, um das gleiche Ergebnis wie ein Aufruf von zu erzielen mapinsbesondere wenn Sie einen Lambda-Ausdruck als erstes Argument verwenden:
[func(i) for i in iterable]
Als Beispiel für das, was Sie in den Kommentaren zu der Frage angefordert haben – “verwandeln Sie eine Zeichenfolge in ein Array”, möchten Sie mit “Array” wahrscheinlich entweder ein Tupel oder eine Liste (beide verhalten sich ein wenig wie Arrays aus anderen Sprachen). –
Beachten Sie, dass map(list, a) ist in Python 2 äquivalent, aber in Python 3 benötigen Sie die list rufen Sie an, wenn Sie etwas anderes tun möchten, als es in eine einzuspeisen for Schleife (oder eine Verarbeitungsfunktion wie z sum das braucht nur ein Iterable und keine Sequenz). Beachten Sie aber auch noch einmal, dass in der Regel ein Listenverständnis bevorzugt wird:
>>> [list(b) for b in a]
[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]
map (fun x -> (x,x)) scheint nicht schwer zu verstehen … (obwohl es unmöglich wäre, ein echtes kartesisches Produkt aus der Karte zu bekommen, ist alles, was die Karte produziert, immer eine Art Liste)
– Kristopher Micinski
11. Juni 2012 um 2:04 Uhr
map erstellt eine neue Liste, indem eine Funktion auf jedes Element der Quelle angewendet wird:
xs = [1, 2, 3]
# all of those are equivalent — the output is [2, 4, 6]
# 1. map
ys = map(lambda x: x * 2, xs)
# 2. list comprehension
ys = [x * 2 for x in xs]
# 3. explicit loop
ys = []
for x in xs:
ys.append(x * 2)
n-är map entspricht dem Komprimieren von Eingabe-Iterablen und dem anschließenden Anwenden der Transformationsfunktion auf jedes Element dieser gezippten Zwischenliste. Es ist nicht ein kartesisches Produkt:
xs = [1, 2, 3]
ys = [2, 4, 6]
def f(x, y):
return (x * 2, y // 2)
# output: [(2, 1), (4, 2), (6, 3)]
# 1. map
zs = map(f, xs, ys)
# 2. list comp
zs = [f(x, y) for x, y in zip(xs, ys)]
# 3. explicit loop
zs = []
for x, y in zip(xs, ys):
zs.append(f(x, y))
Ich habe verwendet zip hier aber map Das Verhalten unterscheidet sich tatsächlich geringfügig, wenn Iterables nicht die gleiche Größe haben – wie in der Dokumentation angegeben, erweitert es Iterables, um sie zu enthalten None.
kompliziert, versuchen, diesen Beitrag zu verdauen
– Webmaster
11. Juni 2012 um 2:25 Uhr
@WebMaster Was ist daran kompliziert?
– Jossie Calderon
12. Juli 2016 um 16:09 Uhr
Beste Antwort meiner Meinung nach. Die Verwendung des Lambda im Beispiel als Funktion macht es sehr deutlich.
– sheldonzy
24. Februar 2018 um 11:49 Uhr
Leider sind nicht alle gleichwertig – die Ausgabe ist [2,4,6] für das Listenverständnis und die expliziten Schleifen, aber die Karte gibt ein Kartenobjekt zurück – zum Beispiel bekomme ich Folgendes: <map at 0x123a49978> Die ich dann in eine Liste zwingen muss.
– leerssej
3. Dezember 2019 um 6:18 Uhr
Oscar López
Etwas vereinfacht, können Sie sich vorstellen map() so etwas tun:
def mymap(func, lst):
result = []
for e in lst:
result.append(func(e))
return result
Wie Sie sehen können, nimmt es eine Funktion und eine Liste und gibt eine neue Liste mit dem Ergebnis der Anwendung der Funktion auf jedes der Elemente in der Eingabeliste zurück. Ich sagte “ein bisschen vereinfachen”, weil in Wirklichkeit map() verarbeiten kann mehr als eine wiederholbar:
Wenn zusätzliche iterierbare Argumente übergeben werden, muss die Funktion so viele Argumente annehmen und wird parallel auf die Elemente aller iterierbaren Elemente angewendet. Wenn ein Iterable kürzer als ein anderes ist, wird davon ausgegangen, dass es mit None-Elementen erweitert wird.
Für den zweiten Teil der Frage: Welche Rolle spielt dies bei der Herstellung eines kartesischen Produkts? Gut, map()könnte verwendet werden, um das kartesische Produkt einer Liste wie dieser zu erzeugen:
Das map() -Funktion ist dazu da, dasselbe Verfahren auf jedes Element in einer iterierbaren Datenstruktur anzuwenden, wie Listen, Generatoren, Zeichenfolgen und andere Dinge.
Schauen wir uns ein Beispiel an: map() kann über jedes Element in einer Liste iterieren und eine Funktion auf jedes Element anwenden, dann wird es die neue Liste zurückgeben (Sie zurückgeben).
Stellen Sie sich vor, Sie haben eine Funktion, die eine Zahl nimmt, 1 zu dieser Zahl hinzufügt und sie zurückgibt:
def add_one(num):
new_num = num + 1
return new_num
Sie haben auch eine Liste mit Zahlen:
my_list = [1, 3, 6, 7, 8, 10]
Wenn Sie jede Nummer in der Liste erhöhen möchten, können Sie Folgendes tun:
>>> map(add_one, my_list)
[2, 4, 7, 8, 9, 11]
Hinweis: Mindestens map() braucht zwei Argumente. Erstens ein Funktionsname und zweitens so etwas wie eine Liste.
Lass uns ein paar andere coole Dinge sehen map() tun können. map() kann mehrere Iterables (Listen, Strings usw.) nehmen und ein Element von jedem Iterable als Argument an eine Funktion übergeben.
Bei Python2 map()wird gemäß der längsten Liste iterieren (die Elemente der Listen durchlaufen) und übergeben None zu der Funktion für die kürzeren Listen, also sollte Ihre Funktion suchen None und behandeln Sie sie, sonst erhalten Sie Fehler. Bei Python3 map() stoppt nach Abschluss der kürzesten Liste. Auch in Python 3, map() gibt einen Iterator zurück, keine Liste.
Gemeinschaft
Python3 – map(funktion, iterierbar)
Eine Sache, die nicht vollständig erwähnt wurde (obwohl @BlooB es irgendwie erwähnt hat), ist, dass map ein Kartenobjekt zurückgibt NICHT eine Liste. Dies ist ein großer Unterschied, wenn es um die Zeitleistung bei Initialisierung und Iteration geht. Betrachten Sie diese beiden Tests.
import time
def test1(iterable):
a = time.clock()
map(str, iterable)
a = time.clock() - a
b = time.clock()
[ str(x) for x in iterable ]
b = time.clock() - b
print(a,b)
def test2(iterable):
a = time.clock()
[ x for x in map(str, iterable)]
a = time.clock() - a
b = time.clock()
[ str(x) for x in iterable ]
b = time.clock() - b
print(a,b)
test1(range(2000000)) # Prints ~1.7e-5s ~8s
test2(range(2000000)) # Prints ~9s ~8s
Wie Sie sehen können, dauert die Initialisierung der Kartenfunktion fast keine Zeit. Das Iterieren durch das Kartenobjekt dauert jedoch länger als das einfache Iterieren durch das Iterable. Das bedeutet, dass die an map() übergebene Funktion nicht auf jedes Element angewendet wird, bis das Element in der Iteration erreicht wird. Wenn Sie eine Liste wünschen, verwenden Sie list comprehension. Wenn Sie vorhaben, in einer for-Schleife zu iterieren und irgendwann abbrechen, verwenden Sie map.
Was wollen Sie eigentlich erreichen und wofür wollen Sie konkret nutzen
map
?– Kris Harper
11. Juni 2012 um 1:42 Uhr
@WebMaster ja, gemäß dem ersten Satz in der Dokumentation, die Sie eingefügt haben – “Funktion auf jedes iterierbare Element anwenden”. Der Rest des Absatzes befasst sich mit komplexeren Fällen – wie z
map(None, a, b, c)
erweist sich zu tunzip(a, b, c)
. Aber das sieht man in der Praxis sehr selten, gerade weil diezip
Anruf ist gleichwertig.– lvc
11. Juni 2012 um 2:11 Uhr
Ich bemühe mich sehr, Python zu lernen, und wann immer ich eine Definition in python.org eröffne. Nach dem ersten Satz verstehe ich nichts. In Ordnung. Danke.
– Webmaster
11. Juni 2012 um 2:18 Uhr
tuple
ist eine Funktion (na ja, sie ist nuancierter als das, aber sie verhält sich wie eine Funktion), die ein Iterable nimmt und Ihnen ein Tupel mit denselben Elementen gibt – alsotuple([1, 2, 3])
ist äquivalent zu(1, 2, 3)
. Zummap(tuple, array)
,array
wäre ein Iterable von Iterables (denken Sie an eine Liste von Listen), und es gibt Ihnen jede innere Liste zurück, die in ein Tupel umgewandelt wurde.– lvc
11. Juni 2012 um 2:26 Uhr
Im Allgemeinen ist der erste Satz der Dokumentation jeder Funktion am wichtigsten. Wenn du das verstehst, hast du das Wesentliche verstanden. Der Rest spezifiziert das Verhalten sehr detailliert und einiges davon Wille zu Beginn etwas undurchsichtig sein, und Sie müssen möglicherweise auf eine seltsame Redewendung stoßen, die darauf basiert, bevor Sie “oh, das ist was das bedeutet!”. Aber sobald Sie diesen Aha-Moment für ein paar Builtins bekommen haben, sollten Sie anfangen, die Dokumentation etwas leichter zu verstehen.
– lvc
11. Juni 2012 um 2:32 Uhr