Python enumerate pour des paires index et valeur

Python enumerate ajoute un index courant à un itérable, en renvoyant des paires (index, valeur) à chaque itération. Utilisez-le quand vous avez besoin de la position de chaque élément, comme pour des sorties numérotées ou des étiquettes. C’est le schéma intégré pour associer chaque élément à sa position dans des listes, générateurs ou lignes de fichier.

Exemple Python Enumerate Pour Une Sortie Numérotée

Sortie :

La sortie apparaîtra ici...

Sortie :

1. expédier la commande
2. envoyer un email au client

Comment Fonctionne Cet Exemple

  1. enumerate(tasks, start=1) associe chaque tâche à sa position.
  2. start=1 rend les numéros plus lisibles pour un humain.
  3. La sortie montre chaque tâche étiquetée par son numéro.

Pièges courants avec Python enumerate

Erreur 1 : Oublier que la numérotation commence à 0.

for line_no, row in enumerate(rows):
    print(f"Ligne {line_no} : {row['sku']}")
for line_no, row in enumerate(rows, start=1):
    print(f"Ligne {line_no} : {row['sku']}")

Pourquoi ça arrive : enumerate démarre à 0 par défaut, ce qui est correct pour les index mais déroutant pour des numéros de ligne destinés aux humains.

Erreur 2 : Énumérer un dictionnaire en pensant obtenir les valeurs.

region_totals = {"ouest": 1200, "est": 980}
for i, total in enumerate(region_totals):
    print(i, total)
region_totals = {"ouest": 1200, "est": 980}
for i, (region, total) in enumerate(region_totals.items(), start=1):
    print(i, region, total)

Pourquoi ça arrive : itérer un dict renvoie les clés, donc enumerate associe des index aux clés à moins d’itérer sur .items(). Si vous voulez des schémas de recherche clé/valeur, voir l’exemple Python dict.

Erreur 3 : Construire list(enumerate(...)) pour de gros volumes.

indexed_rows = list(enumerate(rows, start=1))
for line_no, row in indexed_rows:
    print(line_no, row)
for line_no, row in enumerate(rows, start=1):
    print(line_no, row)

Pourquoi ça arrive : list() force tous les couples en mémoire, alors que enumerate est déjà paresseux et peut traiter en streaming.

enumerate vs range(len()) : lequel utiliser

Utilisez enumerate quand…Utilisez range(len()) quand…
Vous avez besoin de l’index et de l’élément ensemble.Vous n’avez besoin que d’index numériques.
Vous itérez n’importe quel itérable, y compris des générateurs.Vous devez sauter par pas personnalisés ou itérer par index uniquement.
Vous voulez des boucles lisibles sans indexation manuelle.Vous travaillez avec des index pour le slicing ou l’accès aléatoire.

Règle de base : prenez enumerate pour index + valeur ; utilisez range(len()) quand l’index lui-même est l’essentiel. Si vous n’avez besoin que d’arithmétique d’index, l’exemple Python range va plus loin.

Considérations De Performance

enumerate est O(n) et paresseux, donc il n’alloue pas une liste supplémentaire de paires à moins de l’envelopper avec list(). En pratique, c’est plus rapide et plus clair que d’appeler list.index() dans une boucle (ce qui peut rendre la boucle O(n^2)). Si vous devez juste étiqueter des lignes, enumerate garde une mémoire constante tout en fournissant des numéros de ligne.

Autres cas d’usage de enumerate

Signaler les lignes d’erreur lors de l’analyse de logs.

lines = [
    "INFO connecté",
    "ERREUR délai",
    "INFO nouvelle tentative",
]

for line_no, line in enumerate(lines, start=1):
    if "ERREUR" in line:
        print(f"Ligne {line_no} : {line}")

Cela conserve le numéro de ligne exact associé à chaque erreur, ce qui accélère le débogage et l’analyse d’incidents. Cela fonctionne aussi avec les fichiers car enumerate accepte tout itérable.

Normaliser une liste sur place par index.

names = ["  ada", "grace ", "  linus"]
for i, name in enumerate(names):
    # mettre à jour par index quand vous devez muter la liste sur place
    names[i] = name.strip().title()

print(names)

Cela conserve les données dans la même liste tout en vous donnant l’index nécessaire pour réaffecter. C’est plus clair que de gérer un compteur manuel et la boucle reste lisible.