En python, comment faire quelque chose comme :
for car in cars:
# Skip first and last, do work for rest
En python, comment faire quelque chose comme :
for car in cars:
# Skip first and last, do work for rest
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'
@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.
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
.
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.
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...
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]
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.
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 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.
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 avecif n == some_value
. dans cet exemple, il ferait quelque chose à chaque instance de i, sauf à la première.