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 :

Recherche d'un match dans une liste et suppression. [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Par défaut Recherche d'un match dans une liste et suppression.
    Bonjour à tous,
    Je réalise un petit script pour récupérer des informations sur un gitlab.
    Je stock les noms des différents projets git dans une liste. Je la parcours ensuite pour trouver tout les projets contenant le mot "wiki" et les supprimer de la liste.
    Mon code fonctionne bien mais laisse passer un projet "wiki".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    print(projectsName)
    for projet in projectsName:
            if "wiki.git" in projet:
                projectsName.remove(projet)
    print(projectsName)
    Les output avant apres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_3.wiki.git', 'RD_2.wiki.git', 'RD_1.wiki.git']
    ['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_2.wiki.git']
    Je débute en python, il est possible qu'il me manque une partie du raisonnement mais je ne comprends pas pourquoi j'obtiens ce résultat.
    Merci de vos suggestions

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    >>> w = ['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_3.wiki.git', 'RD_2.wiki.git', 'RD_1.wiki.git']
    >>> for i in w:
    ...     print(w)
    ...     if 'wiki.git' in i:
    ...             w.remove(i)
    ... 
    ['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_3.wiki.git', 'RD_2.wiki.git', 'RD_1.wiki.git']
    ['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_3.wiki.git', 'RD_2.wiki.git', 'RD_1.wiki.git']
    ['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_3.wiki.git', 'RD_2.wiki.git', 'RD_1.wiki.git']
    ['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_3.wiki.git', 'RD_2.wiki.git', 'RD_1.wiki.git']
    ['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_2.wiki.git', 'RD_1.wiki.git']
    >>> w
    ['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_2.wiki.git']
    Lorsque le quatrième objet 'RD_3.wiki.git' est supprimé, l'itération pointe sur le cinquième objet et tu peux voir que c'est maintenant 'RD_1.wiki.git'.

    Règle générale: ne jamais modifier un itérable en cours d'itération.

    Crée d'abord un liste des wiki et ensuite utilise cette liste pour ton remove.

  3. #3
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Cela vient du fait que tu supprimes des éléments dans la liste sur laquelle tu es en train d'itérer,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> l = ['a1', 'b1', 'a2', 'a3']
    >>> for n in l :
    ...     if 'a' in n :
    ...         l.remove(n)
    ... 
    >>> l
    ['b1', 'a3']
    C'est pour cette raison que tu dois itérer sur une copie de ta liste, ou reconstruire une nouvelle liste.

    Grillé par VinsS

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Un manière simple de faire une boucle avec une copie de la liste est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for projet in projectsName[:]:
            if "wiki.git" in projet:
                projectsName.remove(projet)
    print(projectsName)
    C'est le "[:]" qui fait la copie.

  5. #5
    Candidat au Club
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Par défaut
    Merci pour vos réponses j'ai compris mon erreur.
    La solution de tyrtamos pour effectuer la copie fonctionne parfaitement.

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 063
    Par défaut
    L'autre solution, c'est créer une liste avec seulement les éléments souhaités

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> w = ['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_3.wiki.git', 'RD_2.wiki.git', 'RD_1.wiki.git']
    >>> [projet for projet in w if 'wiki.git' not in projet]
    ['RD_2.git', 'RD_1.git', 'RD_3.git']

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    On peut aussi s'en sortir en parcourant la liste à l'envers. Ainsi lorsqu'on supprime un élément, il y a un décalage des éléments qui sont après dans la liste, mais comme on la parcours à l'envers on a déjà traité la fin de la liste. Donc la partie décalé on y retouche pas et le début lui reste inchangé et prêt à traiter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    projectsName=['RD_2.git', 'RD_1.git', 'RD_3.git', 'RD_3.wiki.git', 'RD_2.wiki.git', 'RD_1.wiki.git']
    print(projectsName)
    for projet in reversed(projectsName):
            if "wiki.git" in projet:
                projectsName.remove(projet)
    print(projectsName)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/08/2009, 20h58
  2. Recherche rapide de chaine dans une liste
    Par Esil2008 dans le forum Langage
    Réponses: 3
    Dernier message: 04/11/2008, 14h03
  3. Réponses: 7
    Dernier message: 09/08/2007, 14h07
  4. Recherche sur 2 elements dans une liste box.
    Par molarisapa dans le forum Access
    Réponses: 2
    Dernier message: 29/05/2006, 18h43
  5. Recherche d'un élément dans une liste triée (vitesse)
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 18/05/2006, 09h23

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