map(function, iterable, ...)
Appliquer la fonction à chaque élément d'itérable et renvoyer une liste des résultats. Si des arguments itérables supplémentaires sont passés, la fonction doit prendre autant d'arguments et est appliquée aux éléments de tous les itérables en parallèle.
Si un itérable est plus court qu'un autre, il est supposé être étendu avec aucun élément.
Si la fonction est None
, la fonction d'identité est supposée; s'il y a plusieurs arguments, map()
retourne une liste composée de tuples contenant les éléments correspondants de tous les itérables (une sorte d'opération de transposition).
Les arguments itérables peuvent être une séquence ou tout objet itérable; le résultat est toujours une liste.
Quel rôle cela joue-t-il dans la fabrication d'un produit cartésien?
content = map(tuple, array)
Quel effet la mise d'un tuple n'importe où a-t-elle? J'ai également remarqué que sans la fonction de carte, la sortie est abc
et avec elle, c'est a, b, c
.
Je veux bien comprendre cette fonction. Les définitions de référence sont également difficiles à comprendre. Trop de peluches fantaisie.
la source
map
?map(None, a, b, c)
se révèlezip(a, b, c)
. Mais on le voit très rarement dans la pratique, précisément parce que l'zip
appel est équivalent.tuple
est une fonction (enfin, c'est plus nuancé que ça, mais elle se comporte comme une fonction) qui prend un itérable, et vous donne un tuple avec les mêmes éléments -tuple([1, 2, 3])
est donc équivalent à(1, 2, 3)
. Carmap(tuple, array)
,array
serait un itérable d'itérables (pensez à une liste de listes), et cela vous rend chaque liste intérieure transformée en tuple.Réponses:
map
n'est pas particulièrement pythonique. Je recommanderais plutôt d'utiliser des listes de compréhension:est fondamentalement équivalent à:
map
à lui seul ne peut pas faire un produit cartésien, car la longueur de sa liste de sortie est toujours la même que sa liste d'entrée. Vous pouvez faire trivialement un produit cartésien avec une compréhension de liste cependant:La syntaxe est un peu déroutante - c'est essentiellement équivalent à:
la source
map
beaucoup moins verbeuse que les compréhensions de liste, du moins pour le cas que vous démontrez.map
équivalent de[v.__name__ for v in (object, str)]
?map(lambda v: v.__name__, list)
?map
c'était parfois plus rapide que les compréhensions, parfois non, précisément à cause de la surcharge des appels de fonction? En particulier, l'heuristique que j'ai apprise est que lorsque l'utilisationmap
vous oblige à introduire un appel de fonction supplémentaire, les compréhensions sont plus rapides? Par exemple, j'ai été amené à croire quemap(lambda foo: foo.bar, my_list)
c'est plus lent quefoo.bar for foo in my_list
, et que c'est mêmemap(operator.add, my_list_of_pairs)
plus lent quex + y for x, y in my_list_of_pairs
, précisément en raison de l'appel de fonction supplémentaire.map
ne se rapporte pas du tout à un produit cartésien, bien que j'imagine qu'une personne connaissant bien la programmation fonctionnelle pourrait trouver une façon impossible de comprendre d'en générer un en utilisantmap
.map
en Python 3 est équivalent à ceci:et la seule différence dans Python 2 est qu'il va créer une liste complète de résultats à renvoyer tout d'un coup au lieu de
yield
ing.Bien que la convention Python préfère généralement les listes de compréhension (ou expressions de générateur) pour obtenir le même résultat qu'un appel à
map
, en particulier si vous utilisez une expression lambda comme premier argument:Comme exemple de ce que vous avez demandé dans les commentaires sur la question - «transformer une chaîne en tableau», par «tableau», vous voulez probablement soit un tuple soit une liste (les deux se comportent un peu comme des tableaux provenant d'autres langues) -
Une utilisation
map
ici serait si vous commencez avec une liste de chaînes au lieu d'une seule chaîne -map
pouvez les lister toutes individuellement:Notez que
map(list, a)
c'est équivalent dans Python 2, mais dans Python 3, vous avez besoin de l'list
appel si vous voulez faire autre chose que de l'introduire dans unefor
boucle (ou une fonction de traitement telle quesum
celle-ci n'a besoin que d'un itérable, et non d'une séquence). Mais notez également à nouveau qu'une compréhension de liste est généralement préférée:la source
map
crée une nouvelle liste en appliquant une fonction à chaque élément de la source:n-aire
map
équivaut à compresser ensemble les itérables d'entrée, puis à appliquer la fonction de transformation sur chaque élément de cette liste intermédiaire compressée. Ce n'est pas un produit cartésien:J'ai utilisé
zip
ici, mais lemap
comportement diffère en fait légèrement lorsque les itérables ne sont pas de la même taille - comme indiqué dans sa documentation, il étend les itérables à contenirNone
.la source
[2,4,6]
concerne la compréhension de la liste et les boucles explicites, mais la carte renvoie un objet de carte - par exemple, j'obtiens ceci: que<map at 0x123a49978>
je dois ensuite contraindre dans une liste.Pour simplifier un peu, vous pouvez imaginer
map()
faire quelque chose comme ceci:Comme vous pouvez le voir, il prend une fonction et une liste, et renvoie une nouvelle liste avec le résultat de l'application de la fonction à chacun des éléments de la liste d'entrée. J'ai dit "simplifier un peu" car en réalité
map()
on peut traiter plus d'un itérable:Pour la deuxième partie de la question: quel rôle cela joue-t-il dans la fabrication d'un produit cartésien? bien,
map()
pourrait être utilisé pour générer le produit cartésien d'une liste comme ceci:... Mais à vrai dire, l'utilisation
product()
est un moyen beaucoup plus simple et naturel de résoudre le problème:Quoi qu'il en soit, le résultat est le produit cartésien de la
lst
manière définie ci-dessus:la source
La
map()
fonction est là pour appliquer la même procédure à chaque élément d'une structure de données itérable, comme les listes, les générateurs, les chaînes et autres éléments.Regardons un exemple:
map()
peut parcourir chaque élément d'une liste et appliquer une fonction à chaque élément, puis il retournera (vous rendra) la nouvelle liste.Imaginez que vous ayez une fonction qui prend un nombre, ajoute 1 à ce nombre et le renvoie:
Vous avez également une liste de numéros:
si vous souhaitez incrémenter chaque numéro de la liste, vous pouvez procéder comme suit:
Remarque:
map()
nécessite au minimum deux arguments. D'abord un nom de fonction et ensuite quelque chose comme une liste.Voyons voir d'autres choses sympas qui
map()
peuvent faire.map()
peut prendre plusieurs itérables (listes, chaînes, etc.) et passer un élément de chaque itérable à une fonction comme argument.Nous avons trois listes:
map()
peut vous faire une nouvelle liste qui contient l'ajout d'éléments à un index spécifique.Rappelez
map()
- vous maintenant , a besoin d'une fonction. Cette fois, nous utiliserons lasum()
fonction intégrée . La coursemap()
donne le résultat suivant:RAPPELEZ-VOUS:
En Python 2
map()
, itérera (parcourra les éléments des listes) en fonction de la liste la plus longue, et passeraNone
à la fonction pour les listes plus courtes, donc votre fonction devrait les rechercherNone
et les gérer, sinon vous obtiendrez des erreurs. En Python 3map()
s'arrêtera après avoir terminé avec la liste la plus courte. De plus, en Python 3,map()
renvoie un itérateur, pas une liste.la source
Python3 - carte (func, itérable)
Une chose qui n'a pas été complètement mentionnée (bien que @BlooB l'ait un peu mentionné) est que map retourne un objet map PAS une liste. C'est une grande différence en ce qui concerne les performances temporelles lors de l'initialisation et de l'itération. Considérez ces deux tests.
Comme vous pouvez le voir, l'initialisation de la fonction de carte ne prend presque pas de temps. Cependant, l'itération à travers l'objet de carte prend plus de temps que la simple itération à travers l'itérable. Cela signifie que la fonction passée à map () n'est pas appliquée à chaque élément tant que l'élément n'est pas atteint dans l'itération. Si vous voulez une liste, utilisez la compréhension de liste. Si vous prévoyez de parcourir une boucle for et que vous vous interrompez à un moment donné, utilisez la carte.
la source