Comment sauter la première partie d’un itérable en Python

Vous voulez itérer sur des éléments dans un itérable, mais les premiers éléments ne sont pas d’intérêt et vous voulez juste les jeter. Le module itertools dispose de quelques fonctions qui peuvent être utilisées pour réaliser cette tâche. Le premier est la fonction itertools.dropwhile().

Pour l’utiliser, vous fournissez une fonction et un itérable. L’itérateur retourné annule les premiers éléments de la séquence tant que la fonction fournie retourne Vrai. Ensuite, l’ensemble de la séquence est produit.

Pour illustrer cela, supposons que vous lisez un fichier qui commence par une série de lignes de commentaires. Par exemple:

>>> with open('/etc/passwd') as f:
...     for ligne in f:
...         print(ligne, end='')
...
##
# Base de données des utilisateurs
#
# Notez que ce fichier n'est consulté directement que lorsque le système est en cours d'exécution
##
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
...
>>>

Si vous voulez sauter toutes les lignes de commentaires initiales, voici une façon de le faire:

>>> from itertools import dropwhile
>>> with open('/etc/passwd') as f:
...     for ligne in dropwhile(lambda ligne: ligne.startswith('#'), f):
...          print(ligne, end='')
...
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
...
>>>

Cet exemple est basé sur le saut des premiers éléments en fonction d’une fonction de test. Si vous connaissez le nombre exact d’éléments que vous souhaitez sauter, vous pouvez utiliser itertools.islice() à la place. Par exemple:

>>> from itertools import islice
>>> items = ['a', 'b', 'c', 1, 4, 10, 15]
>>> for x in islice(items, 3, None):
...     print(x)
...
1
4
10
15
>>>

Dans cet exemple, le dernier argument None de islice() est nécessaire pour indiquer que vous voulez que tout soit au-delà des trois premiers éléments plutôt que seulement les trois premiers (par exemple, une tranche de[3 :] plutôt qu’une tranche de [:3]).

Les fonctions dropwhile() et islice() sont principalement des fonctions de commodité que vous pouvez utiliser pour éviter d’écrire du code plutôt malpropre tel que celui-ci:

with open('/etc/passwd') as f:
    # Sauter les commentaires initiaux
    while True:
        ligne = next(f, '')
        if not ligne.startswith('#'):
            break

    # Traiter les lignes restantes
    while ligne:
        # Remplacer par un traitement utile
        print(ligne, end='')
        ligne = next(f, None)

L’élimination de la première partie d’un itérable est également légèrement différente du simple filtrage de l’ensemble. Par exemple, la première partie de ce code pourrait être réécrite comme suit:

with open('/etc/passwd') as f:
    lignes = (ligne for ligne in f if not ligne.startswith('#'))
    for ligne in lignes:
        print(ligne, end='')

Ceci supprimera évidemment les lignes de commentaires au début, mais supprimera également toutes ces lignes dans tout le fichier.

D’autre part, la solution rejette les éléments jusqu’à ce qu’un élément ne corresponde plus au test fourni. Après cela, tous les éléments suivants sont retournés sans filtrage.

Enfin, il faut souligner que ce code fonctionne avec tous les itérables, y compris ceux dont la taille ne peut être déterminée à l’avance. Cela inclut les générateurs, les fichiers et autres types d’objets similaires.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here