189 votes

Python : Boucler sur tous les éléments d'une liste sauf le dernier

Je voudrais parcourir une liste en boucle en vérifiant chaque élément par rapport à celui qui le suit.

Existe-t-il un moyen de boucler sur tous les éléments sauf le dernier en utilisant for x in y ? Je préférerais le faire sans utiliser d'index si possible.

Note

freespace a répondu à ma vraie question, c'est pourquoi j'ai accepté la réponse, mais SilentGhost a répondu à la question que j'aurais dû poser.

Toutes mes excuses pour la confusion.

378voto

freespace Points 9024
for x in y[:-1]

Si y est un générateur, alors ce qui précède ne fonctionnera pas.

Modifier Pour les personnes qui ont voté contre cette réponse parce qu'elles pensent qu'elle ne répond pas à la question, lisez attentivement la question. Notez la phrase qui se termine par un point d'interrogation, c'est-à-dire le truc bouclé avec un point en dessous, comme ceci : ?.

Si cela ne vous satisfait pas, alors peut-être que le fait que David ait accepté cette réponse le fera.

Si cela ne vous convient pas non plus, alors allez-y.

David : Vous êtes invité à refuser cette réponse afin que je puisse la supprimer. Cette réponse me cause du tort.

1 votes

Cela répond à ma question, merci, mais j'ai oublié de demander comment je pourrais obtenir l'objet après x. Est-ce possible ?

0 votes

Je pense qu'une instruction "else" vous permettra de gérer ce qui se passe après la boucle, mais n'oubliez pas de définir x comme le dernier élément.

3 votes

- 1 Je ne pense pas que cela réponde à la question. Il ne s'agit pas de comparer chaque élément avec le suivant. - odwl 0 secs ago

57voto

SilentGhost Points 79627

Le moyen le plus simple de comparer l'élément de séquence avec le suivant :

for i, j in zip(a, a[1:]):
     # compare i (the current) to j (the following)

19 votes

Cela répond à la question que j'aurais aimé poser. Merci

4 votes

En fait, vous pouvez omettre la première tranche, puisque zip tronque la liste la plus longue à la longueur de la plus courte. Cela vous permettra d'économiser une création de liste. (Juste au cas où vous auriez affaire à des listes énormes. Mais dans ce cas, vous devriez suivre l'approche d'Ants Aasma, qui ne copie rien).

20voto

Ants Aasma Points 22921

Si vous voulez obtenir tous les éléments de la séquence par paire, utilisez cette approche (la fonction pairwise provient des exemples du module itertools).

from itertools import tee, izip, chain

def pairwise(seq):
    a,b = tee(seq)
    b.next()
    return izip(a,b)

for current_item, next_item in pairwise(y):
    if compare(current_item, next_item):
        # do what you have to do

Si vous devez comparer la dernière valeur à une valeur spéciale, enchaînez cette valeur à la fin.

for current, next_item in pairwise(chain(y, [None])):

0 votes

Veuillez noter que l'utilisation de next pour le nom de la variable fait de l'ombre à l'intégration.

1 votes

Personnellement, cela ne me dérange pas de suivre des builtins moins utilisés lorsque la portée de la variable est petite et que le nom est bon pour la lisibilité. Néanmoins, j'ai modifié les noms des variables pour maintenir de bonnes pratiques de codage.

7voto

Perpetualcoder Points 7381

Si vous voulez comparer le nième élément avec le n+1ième élément de la liste, vous pouvez également utiliser la méthode suivante

>>> for i in range(len(list[:-1])):
...     print list[i]>list[i+1]

Notez qu'il n'y a pas de codage dur. Cela devrait être correct, sauf si vous pensez le contraire.

4 votes

Vous pourriez remplacer len(list[:-1]) par len(list) - 1 pour éviter une copie de liste. Et éviter d'utiliser une variable appelée list...

2voto

odwl Points 638

Pour comparer chaque élément avec le suivant dans un itérateur sans instancier une liste :

import itertools
it = (x for x in range(10))
data1, data2 = itertools.tee(it)
data2.next()
for a, b in itertools.izip(data1, data2):
  print a, b

2 votes

C'est exactement ce qui a été suggéré par Ants Aasma stackoverflow.com/questions/914715/

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