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

  1. #1
    Membre régulier
    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
    Points : 73
    Points
    73
    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 éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    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
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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]
    @++
    Merci d'utiliser le forum pour les questions techniques.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    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 régulier
    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
    Points : 73
    Points
    73
    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

  7. #7
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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]
    Merci d'utiliser le forum pour les questions techniques.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    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]

  9. #9
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Quelques Notes:

    Les built-in sont largement documentés, pas la comparaison de valeur avec and-or. Cela demande peut être une explication pour jojo971:

    and****
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> 1 and 2
    2
    >>> None and 2
    Avec and les valeurs sont évaluées de gauche à droite en logique booléenne (vrais/faux). Ce qui est Faux(False)*/Vide(None, 0, '', (), [], {}) est faux.
    Comme les valeurs sont évaluées de gauche à droite and retourne (immédiatement, le reste n'est pas évalué) la première valeur false trouvée***
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> {} and 1
    {}
    >>> '' and 1
    ''
    >>> 1 and False and 1
    False
    ou la dernière valeur si tout est vrais.
    Ca correspond à
    or****
    Cela fonctionne pareil sauf que cela retourne la première valeur vrais***.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> False or None or () or 1 or '' or 0
    1
    Ici les valeurs sont évaluées par or qui retourne la première valeur vrais (1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> False or None or () or '' or 0
    0
    Si aucune valeur n'est vrais c'est la dernière valeur qui est retournée.

    C'est ce qu'utilise josmiley avec
    (nb <= 7) and (li.remove(nb) or 'FAILED') or 'OK'

    Puisque j'en suis aux explications de texte.

    Pour ce qui est des built-ins (map(li.remove, filter(lambda x: x < 7, li)))
    filter applique la fonction lambda x: x < 7 à la liste et retourne une liste (cela ne touche pas à la liste d'origine).
    map applique la méthode .remove()** de l'objet liste li aux éléments de la nouvelle liste et retourne une liste.
    Bref, nous avons une utilisation des built ins (rapides) mais des créations de liste... Vous comprendrez donc que mon exemple n'est la que pour montrer les built-ins et fonctionne dans le cas présent mais qu'il est possible de ne travailler que sur la liste d'origine.

    Citation Envoyé par PauseKawa Voir le message
    Vous ne pouvez pas (ou plutôt ne devez pas) modifier une liste lors de son itération.
    Pour le moment en fait.
    C'est possible donc utilisable dans certains cas/besoins.
    Essayez plutôt de commencer avec while.

    Vous pouvez aussi travailler sur l'index.

    Exemple 'simpliste' sur celui de josmiley (récursif avec while et l'index):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    >>> li = [3, 8, 5, 3, 6, 8, 3, 8, 5, 3, 6, 8]
    >>> current_index = len(li) -1 # L'index commence a zero
    >>> while current_index > -1:
    ...     if li[current_index] > 7:
    ...         print "    + %d ||  OK" % (li[current_index])
    ...     else:
    ...         print "    + %d ||  FAILED" % (li[current_index])
    ...         _ = li.pop(current_index) # *****
    ...         # li.pop(current_index)
    ...     current_index -= 1
    ... 
        + 8 ||  OK
        + 6 ||  FAILED
        + 3 ||  FAILED
        + 5 ||  FAILED
        + 8 ||  OK
        + 3 ||  FAILED
        + 8 ||  OK
        + 6 ||  FAILED
        + 3 ||  FAILED
        + 5 ||  FAILED
        + 8 ||  OK
        + 3 ||  FAILED
    >>> li
    [8, 8, 8, 8]
    Vous comprendrez qu'avec la souplesse de Python les possibilités sont multiples. A vous de trouver ce qui vous vas.

    string
    Dans votre code vous concaténez via +
    Voici deux autres façons de faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> print "%d%s" % (1, "$")
    1$
    >>> print "{0}{1}".format(1, "$")
    1$
    (Cela ne vous concerne pas puisque vous utilisez Python 2.x mais en Python 3.x il est conseiller d'utiliser .format())
    Vous remarquerez %s et %d: VV33D vous le signale plus haut 7 n'est pas '7', un str n'est pas un int.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> "%d" % '1'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: %d format: a number is required, not str
    .format() lui fait la conversion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> "{0}".format(1)
    '1'
    >>> "{0}".format('1')
    '1'
    De la lecture supplémentaire.

    Sur ce je laisse de la place pour les autres

    @+

    Tips
    *)
    False = 0
    True = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> valeur = True
    >>> ('Faux', 'Vrais')[valeur]
    'Vrais'
    >>> valeur = False
    >>> ('Faux', 'Vrais')[valeur]
    'Faux'
    **)
    .remove() ne supprime que le premier élément trouvé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> li = [1, 2, 1, 2, 1]
    >>> li.remove(2)
    >>> li
    [1, 1, 2, 1]
    >>> while 2 in li:
    ...     li.remove(2)
    ... 
    >>> li
    [1, 1, 1]
    ***)
    Vous en comprendrez toute l'utilité si les traitements sont lourds.
    ****)
    Il n'est pas possible d'utiliser if avec les fonctions lambda mais and/or oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    >>> v = 1
    >>> if v:
    ...     print v
    ... else:
    ...     print 'False'
    ... 
    1
    >>> v = 0
    >>> if v:
    ...     print v
    ... else:
    ...     print 'False'
    ... 
    False
    >>> v = 1
    >>> v or False
    1
    >>> v = 0
    >>> v or False
    False
    *****)
    pop() écrit sur la sortie standard.
    Merci d'utiliser le forum pour les questions techniques.

+ 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