En Python, vous pouvez utiliser 𝐦𝐚𝐩() pour appliquer des fonctions intégrées, des expressions lambda ( 𝐥𝐚𝐦𝐛𝐝𝐚 ), des fonctions définies avec 𝐝𝐞𝐟 , etc., à tous les éléments d’itérables, tels que les listes et les tuples.
Notez que 𝐦𝐚𝐩() peut être remplacé par des compréhensions de liste ou des expressions de générateur. Comme décrit plus loin, il est préférable de les utiliser dans de nombreux cas.
Utilisation de base de 𝐦𝐚𝐩()
Le premier argument de 𝐦𝐚𝐩() est un objet appelable, tel qu’une fonction à appliquer, et le deuxième argument est un objet itérable, tel qu’une liste.
𝐦𝐚𝐩() renvoyer un itérateur en Python3
Appliquez la fonction intégrée 𝐚𝐛𝐬() qui renvoie la valeur absolue.
En Python 3, 𝐦𝐚𝐩() renvoie un itérateur de type 𝐦𝐚𝐩 . Notez que l’utilisation de 𝐩𝐫𝐢𝐧𝐭() directement sur cet objet n’affichera pas ses éléments.
l = [-2, -1, 0] print(map(abs, l)) # <map object at 0x10651a400> print(type(map(abs, l))) # <class 'map'>
La valeur de l’itérateur peut être récupérée avec une instruction 𝐟𝐨𝐫 .
for i in map(abs, l): print(i) # 2 # 1 # 0
Le même résultat est obtenu si le processus est exécuté dans un bloc 𝐟𝐨𝐫 sans utiliser 𝐦𝐚𝐩() .
for i in l: print(abs(i)) # 2 # 1 # 0
Notez que 𝐦𝐚𝐩() dans Python 2 renvoie une liste, ce qui peut entraîner des problèmes lors de l’exécution de code Python 2 dans Python 3.
Convertir en liste
Si vous souhaitez convertir le résultat de 𝐦𝐚𝐩() en une liste, utilisez 𝐥𝐢𝐬𝐭() .
l = [-2, -1, 0] print(list(map(abs, l))) # [2, 1, 0]
Par exemple, appliquez 𝐥𝐞𝐧() à une liste de chaînes pour la convertir en une liste du nombre de caractères.
l_s = ['apple', 'orange', 'strawberry'] print(list(map(len, l_s))) # [5, 6, 10]
Dans le deuxième argument de 𝐦𝐚𝐩() , non seulement une liste mais également un itérable tel qu’un tuple ou 𝐫𝐚𝐧𝐠𝐞 peut être spécifié.
print(list(map(abs, range(-2, 1)))) # [2, 1, 0]
Appliquer des expressions lambda ( 𝐥𝐚𝐦𝐛𝐝𝐚 )
Si vous souhaitez appliquer un processus au lieu d’une fonction intégrée, utilisez l’expression lambda ( 𝐥𝐚𝐦𝐛𝐝𝐚 ).
l = [-2, -1, 0] print(list(map(lambda x: x**2, l))) # [4, 1, 0]
Appliquer les fonctions définies avec 𝐝𝐞𝐟
Il est également possible de définir une fonction avec 𝐝𝐞𝐟 et de la précisément comme premier argument de 𝐦𝐚𝐩() .
l = [-2, -1, 0]
def square(x): return x**2 print(list(map(square, l))) # [4, 1, 0]
Spécifier plusieurs itérables comme arguments
Vous pouvez définir plusieurs itérables dans 𝐦𝐚𝐩() comme 𝐦𝐚𝐩(𝐟𝐮𝐧𝐜𝐭𝐢𝐨𝐧, 𝐢𝐭𝐞𝐫𝐚𝐛𝐥𝐞1, 𝐢𝐭𝐞𝐫𝐚𝐛𝐥𝐞2, …) .
Si plusieurs itérables sont spécifiés, le premier argument doit être une fonction qui reçoit ce nombre d’arguments. Une erreur est générée si le nombre d’itérables ne correspond pas au nombre d’arguments reçus par la fonction.
l_1 = [1, 2, 3] l_2 = [10, 20, 30] print(list(map(lambda x, y: x * y, l_1, l_2))) # [10, 40, 90] # print(list(map(abs, l_1, l_2))) # TypeError: abs() takes exactly one argument (2 given)
Si les itérables ont des tailles différentes (nombre d’éléments), les éléments supplémentaires sont ignorés.
l_3 = [100, 200, 300, 400] print(list(map(lambda x, y, z: x * y * z, l_1, l_2, l_3))) # [1000, 8000, 27000]
Utiliser plutôt des compréhensions de liste et des expressions génératrices
Le même processus que 𝐦𝐚𝐩() peut être réalisé avec des compréhensions de liste et des expressions de générateur.
l = [-2, -1, 0] print([abs(x) for x in l]) # [2, 1, 0] print([x**2 for x in l]) # [4, 1, 0] l_1 = [1, 2, 3] l_2 = [10, 20, 30] print([x * y for x, y in zip(l_1, l_2)]) # [10, 40, 90]
Si vous souhaitez obtenir une liste comme 𝐥𝐢𝐬𝐭(𝐦𝐚𝐩()) , utilisez les compréhensions de liste, et si vous souhaitez obtenir un itérateur comme 𝐦𝐚𝐩() , utilisez une expression génératrice.
Comme le montre la question Stack Overflow suivante, dans la plupart des cas, l’utilisation de compréhensions de liste et d’expressions de générateur est préférable à 𝐦𝐚𝐩() car le code est plus concis et clair.
Pour la vitesse de traitement, les réponses suivantes ont été fournies.
- python – Compréhension de liste vs. map – 40948713
- Compréhensions de listes et 𝐥𝐢𝐬𝐭(𝐦𝐚𝐩())
- Lors de l’application de fonctions intégrées, 𝐥𝐢𝐬𝐭(𝐦𝐚𝐩()) est plus rapide.
- Lors de l’application d’expressions lambda, la compréhension de la liste est plus rapide.
- Expressions génératrices et 𝐦𝐚𝐩()
- 𝐦𝐚𝐩() est plus rapide.
- Compréhensions de listes et 𝐥𝐢𝐬𝐭(𝐦𝐚𝐩())
Gardez à l’esprit que la vitesse de traitement peut varier en fonction de divers facteurs. Si la vitesse est cruciale pour votre cas d’utilisation, il est recommandé d’effectuer des mesures dans des conditions qui correspondent étroitement à votre utilisation réelle.
Utilisez plutôt NumPy
Dans le cas d’une liste de nombres, le processus de 𝐦𝐚𝐩() peut également être réalisé avec NumPy. Le code est encore plus clair que 𝐦𝐚𝐩() et les compréhensions de liste.
import numpy as np a = np.array([-2, -1, 0]) print(np.abs(a)) # [2 1 0] print(a**2) # [4 1 0] a_1 = np.array([1, 2, 3]) a_2 = np.array([10, 20, 30]) print(a_1 * a_2) # [10 40 90]
NumPy est plus rapide pour les grandes listes et les traitements complexes. NumPy propose diverses fonctions, vous devriez donc les essayer si vous traitez un tableau de nombres.