Comment itérer sur les paires de valeurs d’indice d’une séquence en Python

Vous voulez itérer sur une séquence, mais vous aimeriez savoir quel élément de la séquence est en cours de traitement. La fonction enumerate() intégrée gère cela très bien:

>>> uneliste = ['aa', 'ab', 'ac']
>>> for idx, val in enumerate(uneliste):
...     print(idx, val)
...
0 aa
1 ab
2 ac

Pour imprimer des sorties avec des numéros canoniques (où vous commencez généralement la numérotation à 1 au lieu de 0), vous pouvez passer un argument de début:

>>> uneliste = ['aa', 'ba', 'ac']
>>> for idx, val in enumerate(uneliste, 1):
...     print(idx, val)
...
1 aa
2 ba
3 ac

Ce cas est particulièrement utile pour le suivi des numéros de ligne dans les fichiers si vous souhaitez utiliser un numéro de ligne dans un message d’erreur:

def parseur(fichier):
    with open(fichier, 'rt') as f:
         for ligneno, ligne in enumerate(f, 1):
             champs = ligne.split()
             try:
                 compteur = int(champs[1])
                 ...
             except ValueError as e:
                 print('Ligne {}: Erreur de parsage: {}'.format(ligneno, e))

enumerate() peut être utile pour garder la trace du décalage dans une liste pour les occurrences de certaines valeurs, par exemple.

Ainsi, si vous voulez mapper les mots d’un fichier aux lignes dans lesquelles ils apparaissent, vous pouvez facilement le faire en utilisant la fonction énumérer() pour mapper chaque mot au décalage de ligne dans le fichier où il a été trouvé:

sommaire = defaultdict(list)

with open('fichier.txt', 'r') as f:
    lignes = f.readlignes()

for idx, ligne in enumerate(lignes):
    # Crée une liste de mots sur la ligne courante
    mots = [w.strip().lower() for w in ligne.split()]
    for mot in mots:
        sommaire[mot].append(idx)

Si vous imprimez la variable sommaire après avoir traité le fichier, ce sera un dictionnaire (un dict par défaut pour être précis), et il y aura une clé pour chaque mot. La valeur de chaque clé-mot sera une liste des numéros de ligne sur lesquels ce mot est apparu.

Si le mot s’est produit deux fois sur une seule ligne, ce numéro de ligne sera inscrit deux fois, ce qui permettra d’identifier diverses mesures simples du texte.

enumerate() est un joli raccourci pour les situations où vous pourriez être enclin à garder votre propre variable compteur. Tu pourrais écrire du code comme ça:

ligneno = 1
for ligne in f:
    # Traiter la ligne
    ...
    ligneno += 1

Mais il est généralement beaucoup plus élégant (et moins sujet aux erreurs) d’utiliser enumerate() à la place:

for ligneno, ligne in enumerate(f):
    # Traiter la ligne
    ...

La valeur retournée par enumerate() est une instance d’un objet énumératif, qui est un itérateur qui retourne des tuples successifs composés d’un compteur et la valeur retournée en appelant next() sur la séquence que vous avez y passée comme argument.

Bien qu’il s’agisse d’un point mineur, il vaut la peine de mentionner qu’il est parfois facile de se faire trébucher lorsqu’on applique la fonction énumérer() à une séquence de tuples qui sont également déballés.

Pour le faire, vous devez écrire du code comme ceci:

donnees = [ (1, 2), (3, 4), (5, 6), (7, 8) ]

# Correcte!
for n, (x, y) in enumerate(donnees):
    ...

# Erreur!
for n, x, y in enumerate(donnees):
    ...

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here