Énumérer des listes avec la fonction enumerate() de Python
- 2021-08-17
- Publié par : Christophe DELEUZE
- Catégorie : Python
La fonction enumerate() en Python est un incontournable. C’est une fonctionnalité très utile qui permet de parcourir une collection d’éléments tout en gardant une trace de l’index de l’élément actuel dans une variable de compteur.
Regardons un exemple :
noms = ['Bob', 'Alice', 'Guido']
for index, value in enumerate(noms):
print(f'{index}: {value}')
Le résultat sera le suivant :
0: Bob
1: Alice
2: Guido
Comme vous pouvez le voir, nous avons parcouru la liste noms et généré un index pour chaque élément en augmentant une variable de compteur commençant à partir de zéro.
Si vous vous posez des questions sur la syntaxe f'...' que j’ai utilisée dans l’exemple ci-dessus, il s’agit d’une technique de formatage de chaine disponible depuis la version 3.6 de Python.
Rendez vos boucles plus pythoniques avec enumerate()
Maintenant, pourquoi est-il utile de conserver un index en cours d’exécution avec la fonction enumerate() ?
Car cela est très pratique, notamment pour manipuler des listes, des tuples ou n’importe quel itérable. En effet, dans les listes (mais pas que), les éléments étant ordonnés à l’aide de leur index, pour pouvoir les manipuler, vous aurez donc besoin de connaitre leur index.
Toutefois, certains développeurs Python venant du langage C ou Java utilisent parfois le contrintuitif range(len(...)) pour obtenir un index en cours d’exécution tout en itérant sur une liste avec une boucle :
# EXEMPLE contre intuitif !
for i in range(len(my_items)):
print(i, my_items[i])
Alors qu’en utilisant habilement la fonction enumerate(), comme je vous l’ai montré dans l’exemple précédent avec la liste noms, vous pouvez rendre cette boucle beaucoup plus lisible, donc de fait plus pythonique.
De plus, il n’est généralement pas nécessaire de générer manuellement des index d’éléments en Python. Vous pouvez simplement laisser tout ce travail à la fonction enumerate() qui s’occupera de les générer pour vous. Par conséquent, votre code sera plus facile à lire et moins vulnérable aux fautes de frappe.
Modification de l'index de départ
Une autre fonctionnalité utile d’enumerate() est la possibilité de choisir l’index de départ pour l’énumération. La fonction enumerate() accepte un argument facultatif qui vous permet de définir la valeur initiale de sa variable compteur :
noms = ['Bob', 'Alice', 'Guido']
for index, value in enumerate(noms, 1):
print(f'{index}: {value}')
Dans l’exemple ci-dessus, j’ai ajouté à enumerate() un argument supplémentaire dont la valeur est 1. Comme le rôle de cet argument est de définir la valeur initiale de la variable compteur, l’index commencera maintenant à 1 au lieu de commencer par sa valeur par défaut qui est 0 :
1: Bob
2: Alice
3: Guido
Voilà, c’est ainsi que vous passez de l’indexation à base 0 à l’indexation à base 1 (ou tout autre entier, d’ailleurs) en utilisant la fonction enumerate() de Python.
Comment marche enumerate() dans les coulisses
Vous vous demandez peut-être comment la fonction enumerate() fonctionne dans l’arrière-boutique ? Une partie de sa magie réside dans le fait qu’enumerate() est implémentée en tant qu’itérateur Python. Cela signifie que les index des éléments sont générés un par un et à la volée, ce qui réduit l’utilisation de la mémoire tout en vous assurant de bénéficier de la meilleure performance possible en termes de vitesse.
Illustrons mes propos :
>>> noms = ['Bob', 'Alice', 'Guido']
>>> enumerate(noms)
<enumerate object at 0x1057f4120>
Dans l’extrait de code ci-dessus, j’ai utilisé la même énumération que vous avez déjà vue dans les exemples précédents. Mais au lieu de parcourir immédiatement le résultat de l’appel à enumerate(), j’affiche simplement l’objet renvoyé sur la console Python.
Comme vous pouvez le voir, il s’agit d’un itérable : <enumerate object at 0x1057f4120>. C’est l’itérateur réel. Et comme je l’ai dit, il génère ses éléments de sortie un par un et lorsqu’ils sont demandés (à la volée).
Afin de récupérer ces éléments pour que nous puissions les inspecter, je vais donc utiliser la fonction native list() sur l’itérateur :
>>> list(enumerate(noms))
[(0, 'Bob'), (1, 'Alice'), (2, 'Guido')]
Pour chaque élément de la liste noms, l’itérateur enumerate() produit un tuple de la forme (index, element). Dans notre boucle for, nous utilisons cela à notre avantage en tirant parti de la fonctionnalité d’unpacking (décompression) de la structure de données :
for index, element in enumerate(iterable):
# ...
Le mot de la fin
Pour résumer, enumerate() est une fonction native de Python. Vous l’utiliserez pour boucler sur un itérable afin d’obtenir, en plus des éléments, un index d’exécution automatique généré par une variable de compteur. De plus, le compteur commence à 0 par défaut, mais vous pouvez le définir sur n’importe quel entier. Enfin, la fonction enumerate() de Python vous aidera à écrire des boucles plus lisibles et vous évitera de recourir à une indexation manuelle qui pourrait être sujette aux erreurs. Pour conclure, afin d’utiliser tout son potentiel, je vous conseille d’étudier en complément les itérateurs de Python et l’unpacking.
J’espère que vous aurez apprécié ce court article sur cette super fonction et si vous avez des questions, les commentaires sont là pour ça.
Merci pour le billet :]
Merci beaucoup pour vos explications claires et concises sur la fonction iterate.
plutôt la fonction enumerate()