283 votes

Sauter la première entrée dans la boucle for en python ?

En python, comment faire quelque chose comme :

for car in cars:
   # Skip first and last, do work for rest

4 votes

Je suis un nouveau venu, mais j'ai utilisé for n, i in enumerate(cars): if n!= 0: do something to i . la logique est qu'il ajoute un "compteur" à chaque valeur que vous pouvez ensuite cibler par exemple avec if n == some_value . dans cet exemple, il ferait quelque chose à chaque instance de i, sauf à la première.

541voto

Abhijit Points 24122

Pour sauter le premier élément en Python, vous pouvez simplement écrire

for car in cars[1:]:
    # Do What Ever you want

ou pour sauter le dernier élément

for car in cars[:-1]:
    # Do What Ever you want

Vous pouvez utiliser ce concept pour tout sequence (pas pour un iterable cependant).

76 votes

Pas pour tous itérables mais pour tous séquences .

8 votes

Et l'utilisation de la mémoire ? La tranche fait-elle une nouvelle copie de la sous-séquence ?

3 votes

@Voyager Oui, il fait une nouvelle copie.

333voto

agf Points 45052

Les autres réponses ne fonctionnent que pour une séquence.

Pour tout itérable, permet de sauter le premier élément :

itercars = iter(cars)
next(itercars)
for car in itercars:
    # do work

Si vous voulez sauter le dernier, vous pouvez le faire :

itercars = iter(cars)
# add 'next(itercars)' here if you also want to skip the first
prev = next(itercars)
for car in itercars:
    # do work on 'prev' not 'car'
    # at end of loop:
    prev = car
# now you can do whatever you want to do to the last one on 'prev'

1 votes

Voir aussi Sven Marnach 's réponse

2 votes

J'ai trouvé que faire cars.pop(0) et cars.pop() fonctionne bien.

1 votes

@dreamwork801 Ma réponse et celle de Sven, que je mets en lien dans le premier commentaire, fonctionnent pour n'importe quel itérable, même infini, car elles ne nécessitent pas une opération O(n) sur les données avant le début de l'itération. Votre suggestion, et celle d'Abhjit, ne fonctionnent que pour les séquences, pas pour n'importe quel itérable.

54voto

Roee Shenberg Points 417

La meilleure façon de sauter le(s) premier(s) élément(s) est :

from itertools import islice
for car in islice(cars, 1, None):
    pass
    # do something

islice dans ce cas, est invoqué avec un point de départ de 1 et un point final de None ce qui signifie la fin de la iterable .

Pour pouvoir sauter des éléments à partir de la fin d'un document iterable vous devez connaître sa longueur (toujours possible pour une liste, mais pas nécessairement pour tout ce sur quoi vous pouvez itérer). par exemple, islice(cars, 1, len(cars)-1) sautera le premier et le dernier élément dans cars .

0 votes

Jetez un coup d'œil à la réponse (sous-estimée) de Sven. Il couvre le saut d'un nombre arbitraire d'éléments au début et/ou à la fin de n'importe quel itérable à l'aide des méthodes suivantes islice tout à fait bien, sans connaître la longueur ou stocker en mémoire plus d'éléments à la fois qu'il n'est absolument nécessaire.

0 votes

La réponse de Sven va en fait stocker l'itérateur entier en mémoire - collections.deque va parcourir l'itérateur. Essayez de faire quelque chose comme collections.deque(xrange(10000000)). Il n'est pas nécessaire de stocker tous les ints en mémoire si vous voulez sauter le premier élément...

2 votes

Un site islice est ce qui est transmis à la deque et non l'itérateur entier, et c'est seulement la longueur du nombre d'éléments à sauter à la fin. Il ne stocke pas l'itérateur entier en mémoire.

32voto

Sven Marnach Points 133943

Voici une fonction de générateur plus générale qui saute un nombre quelconque d'éléments du début et de la fin d'un itérable :

def skip(iterable, at_start=0, at_end=0):
    it = iter(iterable)
    for x in itertools.islice(it, at_start):
        pass
    queue = collections.deque(itertools.islice(it, at_end))
    for x in it:
        queue.append(x)
        yield queue.popleft()

Exemple d'utilisation :

>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]

0 votes

Il faudrait peut-être ajouter un chemin rapide pour at_end == 0 .

0 votes

Collections.deque(...) va immédiatement parcourir l'itérateur. Cela signifie que skip(xrange(10000000), 1) occupera beaucoup de mémoire, même si cela ne devrait pas être le cas.

4 votes

@RoeeShenberg : skip(xrange(10000000), 1) utilisera at_end=0 donc le paramètre à deque() sera islice(it, 0) qui ne consommera que zéro élément de it . Cela n'occupera pas beaucoup de mémoire.

16voto

KurzedMetal Points 4351
for item in list_name[1:-1]:
    #...do whatever

3 votes

N'utilisez pas list comme nom de variable

2 votes

Le PO veut seulement sauter le premier élément. pourquoi :-1 ?

8 votes

Ce n'est pas vraiment réservé ; le nom list peut être reliée à nouveau. C'est pourquoi vous ne devrait pas plutôt que ne peut pas utilisez-le.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X