IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

supprimer élément d'une liste


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Par défaut supprimer élément d'une liste
    j'ai une liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    li=[3,5]
     
    for liste in li:  
                    nb=liste
                    if (nb)>'7':
                            print"    + "+nb+" ||  OK"  
                    else:
                            print"    + "+nb+" || FAILED"
                            li.remove(nb)
    Je veux juste qu' à chaque fois qu'il rencontre une valeur supérieur à 7 il ecrit OK par contre si inférieur il met FAILED et si inérieur retire de la liste
    Problème il passe une seul fois dans la boucle il retire 3 mais pas 5 ,j'ai pas encore compris pourqoi
    Avez une piste la solution est surement simple.....il doit probablement sortir de la boucle à cause du remove

  2. #2
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Bonjour

    Si ton but est de comparer des entiers ou réels, enlève les guillemets.
    Sinon il va comparer des caractères (et j'imagine que le caractère '7' ne vaut pas 7)
    Ensuite, tu aura effectivement un bug en faisant un remove sur une liste pendant que tu iteres dessus. A la place, tu stockes les éléments que tu veux retirer dans un autre liste, et à la fin de ta boucle, tu retires tous ces éléments d'un coup.

    Par ailleurs, liste est un tres mauvais nom de variable, puisqu'elle représente les éléménts. Fais plutot directement

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    C'est bien le remove lors de l'itération (for) qui vous pose problème.
    Vous avez le premier élément de votre liste (index 0) qui est 3 et le second (index 1) 5.
    Si vous enlevez 3, 5 prend l'index 0 et vous etes en fin de liste (sortie de l'itération/for)
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> li = [3, 8, 5, 6]
    >>> for liste in li:
    ...     nb = liste
    ...     if nb > 7:
    ...         print" + %d || OK" % (nb)
    ...     else:
    ...         print" + %d || FAILED" % (nb)
    ...     li.remove(nb)
    ...
     + 3 || FAILED
     + 5 || FAILED
    Vous remarquerez le décallage de l'index: Avec le remove de 3 8 prend l'index 0 est n'est pas traité. Lorsque 5 est enlevé on arrive a la fin de la liste
    Vous ne pouvez pas (ou plutot ne devez pas) modifier une liste lors de son itération.

    @+

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Petit coup de main au passage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> li = [3, 8, 5, 6]
    >>> li[:] = [val for val in li if val > 7]
    >>> li
    [8]
    @++

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    j'aurai plutôt fait comme ça, puisqu'il faut de toute façon vider la liste ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> li = [3, 8, 5, 6]
    >>> while li:
    ...     nb = li.pop(0)
    ...     print" + %d || %s" %(nb,'OK' if nb > 7 else 'FAILED')
    ... 
     + 3 || FAILED
     + 8 || OK
     + 5 || FAILED
     + 6 || FAILED

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par josmiley Voir le message
    puisqu'il faut de toute façon vider la liste ...
    Bonjour josmiley,

    On ne parlais pas de vider la liste, non ?
    C'est plutot dans le style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> li = [3, 8, 5, 3, 6, 8]
    >>> map(li.remove, filter(lambda x: x < 7, li))
    [None, None, None, None]
    >>> li
    [8, 8]

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Bonjour josmiley,

    On ne parlais pas de vider la liste, non ?
    arf, je me suis basé sur ton code ici sans lire que c' était un exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> li = [3, 8, 5, 6]
    >>> for nb in li[:]:
    ...     print" + %d || %s" %(nb,(nb <= 7)and(li.remove(nb)or'FAILED')or'OK')
    ...     
    ... 
     + 3 || FAILED
     + 8 || OK
     + 5 || FAILED
     + 6 || FAILED
    >>> li
    [8]

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Bonjour,

    C'est bien le remove lors de l'itération (for) qui vous pose problème.
    Vous avez le premier élément de votre liste (index 0) qui est 3 et le second (index 1) 5.
    Si vous enlevez 3, 5 prend l'index 0 et vous etes en fin de liste (sortie de l'itération/for)
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> li = [3, 8, 5, 6]
    >>> for liste in li:
    ...     nb = liste
    ...     if nb > 7:
    ...         print" + %d || OK" % (nb)
    ...     else:
    ...         print" + %d || FAILED" % (nb)
    ...     li.remove(nb)
    ...
     + 3 || FAILED
     + 5 || FAILED
    Vous remarquerez le décallage de l'index: Avec le remove de 3 8 prend l'index 0 est n'est pas traité. Lorsque 5 est enlevé on arrive a la fin de la liste
    Vous ne pouvez pas (ou plutot ne devez pas) modifier une liste lors de son itération.

    @+
    Merci c'est l'explication que je cherchais c'est plutot logique je comprend mieux je voyais d'ou cela pourrais venir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer élément d'une liste après un query sql
    Par gégé140488 dans le forum Hibernate
    Réponses: 1
    Dernier message: 27/09/2010, 12h25
  2. Supprimer le 1er élément d'une liste chainée
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 02/06/2007, 01h05
  3. Réponses: 12
    Dernier message: 04/03/2007, 11h43
  4. Réponses: 3
    Dernier message: 25/10/2006, 19h08
  5. Supprimer des éléments d'une liste
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo