Python fournit les fonctions map(), filter() et zip() qui permettent d’avoir un code plus efficace dans le traitement des données. En fait, ces fonctions peuvent vous faire gagner beaucoup de temps lorsque vous travaillez avec des itérables.

L’idée est de prendre une petite fonction que vous écrivez et de l’appliquer à tous les éléments d’une séquence, ce qui vous évitera d’écrire une boucle.

Les fonctions map, zip et filter

La fonction map()

La fonction map () de Python applique une fonction sur tous les éléments d’une séquence itérable et renvoie un objet map.

La fonction map() prend deux arguments positionnels, la fonction à exécuter sur l’itérable et l’itérable lui même (par exemple: une liste).

Le résultat sera un objet map avec un emplacement en mémoire.

Par exemple, multiplions les nombres d’une liste par 2 de manière basique et stockons le résultat dans une nouvelle liste.

nombres = [2,3,4,5,6]
produit = [] 
for i in nombres: 
    produit.append(i * 2) 
print (produit)

Ce code donne comme résultat :

[4, 6, 8, 10, 12]

La fonction map() nous permet d’avoir le même résultat d’une manière beaucoup plus simple et élégante.

nombres = [2,3,4,5,6]
produit = list(map(lambda x: x * 2, nombres))
print (produit)

Vous avez certainement remarqué que nous avons utilisé la fonction lambda, qui est très pratique dans ces situations. On utilise souvent lambda avec les fonctions map, filter et zip . Lambda est une fonction qui peut utiliser n’importe quelle nombre de paramètres, mais qui n’utilise qu’une seule expression.

La fonction filter()

La fonction filter() crée une liste d’éléments pour lesquels la fonction renvoie True. Elle nécessite une fonction et une séquence (itérable) comme paramètres.

Supposons que nous voulions récupérer les nombres pairs à partir d’une liste et les mettre dans une nouvelle liste.

nombres = [1,2,3,4,5,6,7,8,9,10,11,12]
nouvelle_list = []
for i in nombres:
    if i % 2 == 0:
        nouvelle_list.append(i)
print(nouvelle_list)

Ce code vous donne le résultat suivant :

[2, 4, 6, 8, 10, 12]

En fait, nous pouvons utiliser la fonction filter() et avoir le même résultat avec un code plus performant.

nombres = [1,2,3,4,5,6,7,8,9,10,12]
nouvelle_list = list (filter (lambda x: (x % 2==0), nombres))
print(nouvelle_list)

Mais, quel est la différence entre map() et filter() ?

Prenons à nouveau le même exemple de nombres pairs en utilisant map().

nombres = [1,2,3,4,5,6,7,8,9,10,12]
nouvelle_list = list (map (lambda x: (x % 2==0), nombres))
print(nouvelle_list)

L’exécution du code nous donne :

[False, True, False, True, False, True, False, True, False, True, True]

Qui est une liste de booléens.

Donc, la fonction filter() renvoie la valeur des éléments évalués à True, tandis que map() renvoie tous les éléments de la liste renvoyés par la fonction.

Vous allez vous demandé pourquoi on a enveloppé map() et filter() dans la fonction list() ?

Exécutez ce code :

nouvelle_list = map (lambda x: (x % 2==0), nombres)
print(nouvelle_list)
print(type(nouvelle_list))

Ce qui nous donne l’emplacement en mémoire de l’objet renvoyé par la fonction map() ainsi que le type de cet objet.

<map object at 0x7fe3df7bcac0>
<class 'map'>

La fonction zip()

La fonction zip() en Python combine les éléments de 2 listes selon les index correspondants en une liste de tuples intérable.

lettres = ['a', 'b', 'c', 'd', 'e']
nombres = [1,2,3,4,5]
resultat = list(zip(lettres, nombres))
print(resultat)

L’exécution de ce code nous donne une liste de tuples des éléments des deux listes.

Un exemple simple de l’utilisation combinée de map() et zip() et de trouver l’élément le plus grand en parcourant plusieurs séquences, c’est-à-dire le plus grand du premier élément de chaque séquence, puis du second, et ainsi de suite.

a = [5, 9, 2, 4, 7]
b = [3, 7, 1, 9, 2]
c = [6, 8, 0, 5, 3]
maxs = map(lambda n: max(*n), zip(a, b, c))
print(list(maxs))

L’exécution du code :

[6, 9, 2, 9, 7]

Les fonctions map, filter et zip sont des paradigmes de la programmation fonctionnelle. Elles permettent au programmeur d’écrire du code plus simple et plus court sans avoir à se soucier des complexités telles que les boucles.


0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *