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 :

Elements communs entre deux listes


Sujet :

Python

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Elements communs entre deux listes
    Bonjour,

    Je possède deux listes de listes:
    liste1=[['a','b','c'],['a','b','d'],...,['b','c','d']...] avec plus d'une vingtaine d'éléments
    liste2 =[['b','c','d'],...] avec moins d'une dizaine d'éléments.
    Tous les éléments de la liste 2 sont compris dans la liste 1
    Je cherche donc uniquement à supprimer les éléments de la liste 2 de ma liste1 mais en vain...

    Ce que j'ai tenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for elem in liste1:
       for elem2 in liste2:
          if elem==elem2:
              liste1.remove(elem2))
    Cependant en exécutant mon code, il supprime l'élément suivant de ma liste 1 alors que cet élément suivant est aussi dans ma liste 2...
    Je me retrouve donc avec une liste 1 avec encore quelques éléments de ma liste 2....

    Je ne sais pas si c'est très clair...
    Mais si vous savez comment faire je suis preneur !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Non c'est pas très clair, surtout la phrase: "en executant mon code, il supprime l'element suivant de ma liste 1 alors que cet element suivant est aussi dans ma liste 2... Je me retrouve donc avec une liste 1 avec encore quelques elements de ma liste 2....", car si on fait une boucle, on travaille sur l'item courant... pas le suivant.

    Plutôt que de vous emb... à trouver comment raconter votre histoire en français (c'est bien de vouloir le faire d'autant que le français peut être précis mais il faut maîtriser le vocabulaire technique pour espérer être compréhensible), postez un exemple de code qui produise le problème que vous avez. On lance le code, on voit ce qu'il se passe...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Tous les elements de la liste 2 sont compris dans la liste 1
    Je cherche donc uniquement à supprimer les elements de la liste 2 de ma liste1 mais en vain...
    D'après ce que je comprends, tu veux faire un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    L_1=[1,2,3,4,5,6,7] 
    L_2=[2,5,7]
     
    for i in L_2:
        for j in L_1:
            if (j==i):
                L_1.remove(i)
    print(L_1)
    soit : [1, 3, 4, 6]

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses!
    Mon problème vient du faire que j'ai inversé mes deux boucles for...

    Merci beaucoup pour vos aides !

  5. #5
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    En effet

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par rbnw13 Voir le message
    Mon problème vient du faire que j'ai inversé mes deux boucles for...
    Il suffit de tester pour voir que c'est plus compliqué:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> L_1=[1,2,3,4,5,6,7]
    >>> L_2=[2,5,7]
    >>> for i in L_2:
    ...     for j in L_1:
    ...         if (j==i):
    ...             L_1.remove(i)
    ...
    ...
    >>> L_1
    [1, 3, 4, 6]
    J'inverse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> L_1=[1,2,3,4,5,6,7]
    >>> L_2=[2,5,7]
    >>> for i in L_1:
    ...      for j in L_2:
    ...           if (j==i):
    ...                L_1.remove(i)
    ...
    >>> L_1
    [1, 3, 4, 6]
    >>>
    Et j'obtiens bien le même résultat.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    ça me paraissait plus logique dans ce sens là mais en effet, c'est rigoureusement la même chose..., autant pour moi. Donc je ne vois pas son problème... Peut- être un souci d'indentation ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Archimède Voir le message
    ça me paraissait plus logique dans ce sens là mais en effet, c'est rigoureusement la même chose..., autant pour moi. Donc je ne vois pas son problème... Peut- être un souci d'indentation ?
    C'est la raison pour laquelle je lui ai demandé de poster un code complet permettant de reproduire plutôt que des extraits assaisonnés de texte difficile à lire.

    Sinon avec Python, on peut écrire çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> [ e for e in L_1 if e not in L_2 ]
    [1, 3, 4, 6]
    ou bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> L_1[:] = [ e for e in L_1 if e not in L_2 ]
    pour mettre à jour L_1.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par rbnw13 Voir le message
    Ce que j'ai tenté:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for elem in liste1:
       for elem2 in liste2:
          if elem==elem2:
              liste1.remove(elem2))
    Il ne faut jamais modifier la liste sur laquelle tu es en train d'itérer. Car la liste est réévaluée à chaque itération. Or en supprimant l'élément X ça décale la liste (le X+1 devient le X, le X+2 devient X+1 etc). Et à l'itération suivante tu passes sur le X+1 (qui est devenu le X+2) et finalement tu as raté le X+1 originel. D'où probablement l'origine de ton souci où certains éléments n'ont pas été traités.

    Tu veux modifier une liste sur laquelle tu dois itérer, pas de souci mais alors tu itères sur une copie
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for elem in tuple(liste1):
       for elem2 in liste2:
          if elem==elem2:
              liste1.remove(elem2))

    Citation Envoyé par wiztricks Voir le message
    Et j'obtiens bien le même résultat.
    Euh... essaye avec L_2=[1,2,5,7] juste pour voir...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci à tous pour vos réponses
    Sve@r, c'était exactement ca mon problème. En faisant une copie de ma liste cela fonctionne bien !
    Merci encore

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rbnw13 Voir le message
    Sve@r, c'était exactement ca mon problème. En faisant une copie de ma liste cela fonctionne bien !
    Tu devrais tout de même t'intéresser aux listes en comprehension comme le montre wiztricks => L_1=[ e for e in L_1 if e not in L_2 ]. Bien plus rapide de créer une nouvelle liste ne contenant que ce qui nous intéresse que de traiter une liste existante en supprimant les éléments un à un.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Bonjour,

    Avec les ensembles peut-être ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    L_1=[1,2,3,4,5,6,7] 
    L_2=[2,5,7]
     
    print(set(L_1) ^ set(L_2))
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Euh... essaye avec L_2=[1,2,5,7] juste pour voir...
    Je me suis contenté de demander une description du problème plus précise, réagir sur l'idée que çà pouvait venir de l'inversion... et attendre que le PO réagisse.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Avec les ensembles peut-être ?
    Ca j'y avais pensé. Avec deux ensembles c'est facile de soustraire. Sauf que rien ne garantit que L1 ne contient que des éléments uniques...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Tout à fait, d'où mon point d'interrogation sur la nature des données, qui comme d'habitude est d'une importance primordiale.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ca j'y avais pensé. Avec deux ensembles c'est facile de soustraire. Sauf que rien ne garantit que L1 ne contient que des éléments uniques...
    Et rien ne dit qu'on ne souhaite pas préserver l'ordre...

    Mais comme il est visible que la question est posée par un débutant, lui montrer qu'on peut aborder le problème de différentes façons peut être intéressant... mais quand j'ai testé le Swinnen sur mon fils, j'ai pu constater le désarroi dans lequel il était: pourquoi se prendre le chou à essayer d'apprendre des trucs qui ne serviront à rien? Comment appliquer la bonne méthode?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Communication entre deux Executables ?
    Par QAYS dans le forum Langage
    Réponses: 8
    Dernier message: 11/05/2005, 14h41
  2. communication entre deux executables
    Par semenzato dans le forum MFC
    Réponses: 8
    Dernier message: 13/04/2005, 22h19
  3. Communication entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 13
    Dernier message: 28/01/2005, 09h14
  4. Réponses: 5
    Dernier message: 25/03/2003, 19h43

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