Enumerate en Python : itérer avec index facilement

Découvrez la fonction enumerate en Python : syntaxe, exemples pratiques et bonnes pratiques pour itérer sur des séquences avec un compteur d'index.
9 min de lecture
Believemy logo

Lorsque vous parcourez une séquence en Python, vous avez souvent besoin de connaître non seulement l'élément actuel, mais aussi sa position dans la séquence.

C'est exactement ce que permet la fonction enumerate(). Cette fonction intégrée est l'un des outils les plus élégants et les plus utilisés par les développeurs Python.

Si vous souhaitez maîtriser ce type de fonctionnalités essentielles, notre formation Python complète vous guidera pas à pas dans votre apprentissage.

 

Définition de enumerate

La fonction enumerate() est une fonction intégrée (built-in) de Python qui prend un objet itérable en entrée et retourne un objet enumerate. Cet objet produit des paires composées d'un compteur (index) et des valeurs obtenues en itérant sur l'itérable d'origine.

La syntaxe de base est la suivante :

PYTHON
enumerate(iterable, start=0)

Les paramètres sont :

  • iterable : tout objet itérable (list, tuple, chaîne de caractères, dict, etc.)
  • start (optionnel) : la valeur de départ du compteur, par défaut 0

La fonction retourne un objet enumerate qui est lui-même un itérateur. Chaque élément produit est un tuple contenant l'index et la valeur correspondante.

Bon à savoir

La fonction enumerate() ne crée pas une nouvelle liste en mémoire. Elle génère les paires (index, valeur) à la demande, ce qui la rend très efficace en termes de mémoire.

 

Pourquoi utiliser enumerate ?

Avant de découvrir enumerate(), de nombreux développeurs utilisent une approche moins élégante pour obtenir l'index lors d'une itération. Comparons les différentes méthodes.

L'approche traditionnelle (à éviter)

PYTHON
# Méthode 1 : utiliser range et len
fruits = ['pomme', 'banane', 'cerise', 'orange']

for i in range(len(fruits)):
    print(f"Index {i}: {fruits[i]}")

Cette approche fonctionne, mais elle est moins lisible et plus sujette aux erreurs. Vous devez accéder manuellement à l'élément via son index.

 

L'approche avec un compteur manuel (à éviter)

PYTHON
# Méthode 2 : compteur manuel
fruits = ['pomme', 'banane', 'cerise', 'orange']

index = 0
for fruit in fruits:
    print(f"Index {index}: {fruit}")
    index += 1

Cette méthode est légèrement meilleure car vous accédez directement à l'élément, mais vous devez gérer manuellement le compteur.

 

L'approche Pythonique avec enumerate (recommandée)

PYTHON
# Méthode 3 : enumerate (la meilleure approche)
fruits = ['pomme', 'banane', 'cerise', 'orange']

for index, fruit in enumerate(fruits):
    print(f"Index {index}: {fruit}")

Avec enumerate(), le code est plus concis, plus lisible et moins sujet aux erreurs. C'est la manière idiomatique de parcourir une séquence avec son index en Python.

 

Exemples pratiques d'utilisation

Commencer le compteur à une valeur différente de 0

Par défaut, le compteur commence à 0, mais vous pouvez spécifier une valeur de départ différente avec le paramètre start :

PYTHON
# Numéroter une liste à partir de 1
etudiants = ['Alice', 'Bob', 'Charlie', 'Diana']

print("Liste des étudiants :")
for numero, etudiant in enumerate(etudiants, start=1):
    print(f"{numero}. {etudiant}")

# Résultat :
# 1. Alice
# 2. Bob
# 3. Charlie
# 4. Diana

Cette fonctionnalité est particulièrement utile pour afficher des listes numérotées de manière naturelle pour l'utilisateur.

 

Utilisation avec des chaînes de caractères

Les chaînes de caractères sont itérables en Python. Vous pouvez donc utiliser enumerate() pour parcourir chaque caractère avec son index :

PYTHON
# Trouver les positions d'un caractère dans une chaîne
mot = "programmation"
caractere_recherche = 'a'

positions = []
for index, caractere in enumerate(mot):
    if caractere == caractere_recherche:
        positions.append(index)

print(f"Le caractère '{caractere_recherche}' se trouve aux positions : {positions}")
# Résultat : Le caractère 'a' se trouve aux positions : [6, 10]

 

Modifier des éléments d'une liste en fonction de leur position

Lorsque vous devez modifier des éléments d'une list selon leur position, enumerate() est indispensable :

PYTHON
# Doubler les valeurs aux positions paires
nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for index, valeur in enumerate(nombres):
    if index % 2 == 0:  # Position paire (0, 2, 4, ...)
        nombres[index] = valeur * 2

print(nombres)
# Résultat : [2, 2, 6, 4, 10, 6, 14, 8, 18, 10]

 

Enumerate avec des compréhensions de liste

Vous pouvez combiner enumerate() avec les compréhensions de liste pour écrire du code encore plus concis :

PYTHON
# Créer une liste de tuples (index, valeur_au_carré)
nombres = [1, 2, 3, 4, 5]

resultat = [(i, n**2) for i, n in enumerate(nombres)]
print(resultat)
# Résultat : [(0, 1), (1, 4), (2, 9), (3, 16), (4, 25)]

# Filtrer et garder uniquement les éléments aux indices pairs
elements_pairs = [valeur for index, valeur in enumerate(nombres) if index % 2 == 0]
print(elements_pairs)
# Résultat : [1, 3, 5]

 

Enumerate avec des dictionnaires

Bien que les dict aient leur propre système de clés, vous pouvez utiliser enumerate() pour numéroter les entrées lors de l'affichage :

PYTHON
# Afficher un dictionnaire avec des numéros
personnes = {
    'alice': 25,
    'bob': 30,
    'charlie': 35
}

print("Liste des personnes et leurs âges :")
for numero, (nom, age) in enumerate(personnes.items(), start=1):
    print(f"{numero}. {nom.capitalize()} a {age} ans")

# Résultat :
# 1. Alice a 25 ans
# 2. Bob a 30 ans
# 3. Charlie a 35 ans

 

Traitement de fichiers avec enumerate

Lors de la lecture d'un fichier, enumerate() est très utile pour connaître le numéro de ligne :

PYTHON
# Afficher le contenu d'un fichier avec les numéros de ligne
with open('mon_fichier.txt', 'r') as fichier:
    for numero_ligne, contenu in enumerate(fichier, start=1):
        print(f"Ligne {numero_ligne}: {contenu.strip()}")

Cette technique est particulièrement utile pour le débogage ou la génération de rapports d'erreurs.

 

Fonctionnement interne de enumerate

Pour mieux comprendre enumerate(), voyons comment vous pourriez implémenter cette fonction vous-même :

PYTHON
def mon_enumerate(iterable, start=0):
    """Implémentation simplifiée de enumerate"""
    compteur = start
    for element in iterable:
        yield compteur, element
        compteur += 1

# Utilisation
fruits = ['pomme', 'banane', 'cerise']

for index, fruit in mon_enumerate(fruits):
    print(f"{index}: {fruit}")

Cette implémentation utilise le mot-clé yield pour créer un générateur, ce qui rend la fonction efficace en mémoire, tout comme la vraie fonction enumerate().

Bon à savoir

L'objet retourné par enumerate() est un itérateur. Cela signifie qu'il ne peut être parcouru qu'une seule fois. Si vous avez besoin de le parcourir plusieurs fois, convertissez-le d'abord en liste.

 

Convertir l'objet enumerate

Vous pouvez convertir l'objet enumerate en différentes structures de données :

PYTHON
couleurs = ['rouge', 'vert', 'bleu']

# Convertir en liste de tuples
liste_enumerate = list(enumerate(couleurs))
print(liste_enumerate)
# Résultat : [(0, 'rouge'), (1, 'vert'), (2, 'bleu')]

# Convertir en dictionnaire
dict_enumerate = dict(enumerate(couleurs))
print(dict_enumerate)
# Résultat : {0: 'rouge', 1: 'vert', 2: 'bleu'}

# Convertir en tuple de tuples
tuple_enumerate = tuple(enumerate(couleurs))
print(tuple_enumerate)
# Résultat : ((0, 'rouge'), (1, 'vert'), (2, 'bleu'))

 

Enumerate avec zip

Vous pouvez combiner enumerate() avec zip() pour parcourir plusieurs séquences simultanément tout en gardant un index :

PYTHON
noms = ['Alice', 'Bob', 'Charlie']
scores = [95, 87, 92]

print("Classement des étudiants :")
for position, (nom, score) in enumerate(zip(noms, scores), start=1):
    print(f"{position}ère place : {nom} avec {score} points")

Cette combinaison est extrêmement puissante pour traiter des données tabulaires ou des paires de valeurs.

 

Bonnes pratiques avec enumerate

Nommez vos variables de manière explicite

Utilisez des noms de variables descriptifs plutôt que i et v :

PYTHON
# Moins lisible
for i, v in enumerate(utilisateurs):
    print(f"{i}: {v}")

# Plus lisible
for index, utilisateur in enumerate(utilisateurs):
    print(f"{index}: {utilisateur}")

 

Utilisez start=1 pour les affichages utilisateur

Les utilisateurs finaux s'attendent généralement à ce que la numérotation commence à 1 :

PYTHON
# Pour l'affichage utilisateur
for numero, option in enumerate(options, start=1):
    print(f"{numero}. {option}")

 

N'utilisez pas enumerate si vous n'avez pas besoin de l'index

Si vous n'utilisez pas l'index, une boucle for simple est préférable :

PYTHON
# Inutile
for _, fruit in enumerate(fruits):
    print(fruit)

# Préférable
for fruit in fruits:
    print(fruit)

 

Préférez enumerate à range(len())

Remplacez systématiquement le pattern range(len()) par enumerate() :

PYTHON
# À éviter
for i in range(len(ma_liste)):
    print(i, ma_liste[i])

# À préférer
for i, element in enumerate(ma_liste):
    print(i, element)
Attention

N'oubliez pas que l'objet enumerate est un itérateur à usage unique. Si vous le convertissez en liste pour le réutiliser, vous perdez l'avantage de l'efficacité mémoire.

 

Cas d'utilisation avancés

Créer des menus interactifs

PYTHON
def afficher_menu(options):
    """Affiche un menu numéroté et retourne le choix de l'utilisateur"""
    print("\n=== MENU ===")
    for numero, option in enumerate(options, start=1):
        print(f"{numero}. {option}")
    
    while True:
        try:
            choix = int(input("\nVotre choix : "))
            if 1 <= choix <= len(options):
                return options[choix - 1]
            print("Choix invalide, veuillez réessayer.")
        except ValueError:
            print("Veuillez entrer un nombre valide.")

# Utilisation
options_menu = ['Nouveau fichier', 'Ouvrir', 'Sauvegarder', 'Quitter']
choix_utilisateur = afficher_menu(options_menu)

 

Rechercher un élément et retourner son index

PYTHON
def trouver_premier_index(liste, condition):
    """Trouve l'index du premier élément satisfaisant la condition"""
    for index, element in enumerate(liste):
        if condition(element):
            return index
    return -1

# Utilisation
nombres = [1, 3, 5, 8, 10, 12]
index_pair = trouver_premier_index(nombres, lambda x: x % 2 == 0)
print(f"Premier nombre pair à l'index : {index_pair}")  # Résultat : 3

 

Questions fréquentes

Question

Quelle est la différence entre enumerate() et range(len()) ?

enumerate() est plus Pythonique et plus lisible que range(len()). Avec enumerate, vous obtenez directement l'index et l'élément dans la boucle, sans avoir à accéder manuellement à l'élément via son index. C'est également moins sujet aux erreurs car vous n'avez pas à gérer l'accès par index vous-même.

 

Question

Peut-on utiliser enumerate avec n'importe quel itérable ?

Oui, enumerate() fonctionne avec tous les objets itérables en Python : listes, tuples, chaînes de caractères, dictionnaires, ensembles (sets), fichiers, générateurs, et tout objet implémentant le protocole d'itération. C'est une fonction très polyvalente.

 

Question

L'objet enumerate est-il réutilisable ?

Non, l'objet retourné par enumerate() est un itérateur qui ne peut être parcouru qu'une seule fois. Si vous avez besoin de parcourir les données plusieurs fois, vous devez soit rappeler enumerate() sur l'itérable d'origine, soit convertir le résultat en liste avec list(enumerate(...)) lors de la première itération.

 

Question

Comment apprendre à maîtriser enumerate et les autres fonctions Python ?

Pour maîtriser enumerate() et toutes les fonctionnalités de Python, la pratique régulière est essentielle. Vous pouvez approfondir vos connaissances avec notre formation Python sur Believemy qui couvre en détail les fonctions intégrées, les bonnes pratiques et les techniques avancées pour devenir un développeur Python efficace.

Termes connexes

Découvrez notre glossaire Python

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement avec Python.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.