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 :

extraire que les élements d'une liste hétérogène sans redondance


Sujet :

Python

  1. #1
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut extraire que les élements d'une liste hétérogène sans redondance
    bonjour,
    y a t'il une manière d’extraire d'une liste hétèrogène sans redondance:
    par exemple :
    L=[(12, 5), [(3, 12)] , 12]
    on essayant ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in L:
        lst2 = list(dict.fromkeys(i))
    print(lst2)
    que [(3, 12)] s'affiche alors que
    la resultat souhaité est
    lst2=[12,5,3]

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Citation Envoyé par FATENMRABET Voir le message
    y a t'il une manière d’extraire d'une liste hétèrogène sans redondance:
    par exemple :
    L=[(12, 5), [(3, 12)] , 12]
    Vous mettez votre liste "à plat"(*). Ce qui permet d'obtenir 12, 5, 3, 12, 12 puis vous lui appliquez "set" pour supprimer les doublons.

    (*) cherchez sur Internet "flatten python list".

    Et si vous aviez essayé un code comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in L:
        lst2 = list(dict.fromkeys(i))
    print(lst2)
    d'abord il faudrait expliquer pourquoi cela vous semble une bonne idée... puis "tester" car çà va inévitablement se planter avec i = 12 (le dernier élément de la liste) car ce n'est pas l'itérable qu'attend dict.fromkeys!


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

  3. #3
    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,

    Dans la mesure où la liste L peut contenir des éléments aussi divers (tuple, liste de tuple, entier, ...), je ne vois qu'une fonction récursive qui "aplatit" cette liste.

    Ensuite, pour éviter les doublons, le plus simple est d'utiliser set(...).

    Voilà ce que ça donne:

    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
    def aplatliste(L):
        """transforme un arbre (liste de listes...) en une liste à 1 seul niveau
        """
        R = []
        for elem in L:
            if isinstance(elem, (list, tuple)):
                R.extend(aplatliste(elem))
            else:
                R.append(elem)
        return R
     
     
    L=[(12, 5), [(3, 12)] , 12]
    print(L)
     
    L2 = aplatliste(L)
    print(L2)
     
    L3 = list(set(L2))
    print(L3)
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [(12, 5), [(3, 12)], 12]
    [12, 5, 3, 12, 12]
    [3, 12, 5]
    On voit qu'avec set(), l'ordre des nombres n'est pas forcément préservé. S'il fallait respecter l'ordre, il faudrait une petite boucle, mais ce n'est pas compliqué non plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    L4 = []
    for elem in L2:
        if elem not in L4:
            L4.append(elem)
    print(L4)
    Ce qui donnerait:


  4. #4
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Vous mettez votre liste "à plat"(*). Ce qui permet d'obtenir 12, 5, 3, 12, 12 puis vous lui appliquez "set" pour supprimer les doublons.

    (*) cherchez sur Internet "flatten python list".

    Et si vous aviez essayé un code comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in L:
        lst2 = list(dict.fromkeys(i))
    print(lst2)
    d'abord il faudrait expliquer pourquoi cela vous semble une bonne idée... puis "tester" car çà va inévitablement se planter avec i = 12 (le dernier élément de la liste) car ce n'est pas l'itérable qu'attend dict.fromkeys!


    - W
    pour aplatir j'ai utilisé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    L=[(12, 5), [(3, 12)] , 12]
    flat_list=[]
    for sublist in L:
        for item in sublist:
            flat_list.append(item)
    flat_list = [item for sublist in L for item in sublist]
    print(flat_list)
    flatten = lambda L: [item for sublist in L for item in sublist]
    print(flatten)
    TypeError: 'int' object is not iterable ce plante en 12

  5. #5
    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
    Citation Envoyé par FATENMRABET Voir le message
    pour aplatir j'ai utilisé ça
    Voir ma proposition au dessus.

  6. #6
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Dans la mesure où la liste L peut contenir des éléments aussi divers (tuple, liste de tuple, entier, ...), je ne vois qu'une fonction récursive qui "aplatit" cette liste.

    Ensuite, pour éviter les doublons, le plus simple est d'utiliser set(...).

    Voilà ce que ça donne:

    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
    def aplatliste(L):
        """transforme un arbre (liste de listes...) en une liste à 1 seul niveau
        """
        R = []
        for elem in L:
            if isinstance(elem, (list, tuple)):
                R.extend(aplatliste(elem))
            else:
                R.append(elem)
        return R
     
     
    L=[(12, 5), [(3, 12)] , 12]
    print(L)
     
    L2 = aplatliste(L)
    print(L2)
     
    L3 = list(set(L2))
    print(L3)
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [(12, 5), [(3, 12)], 12]
    [12, 5, 3, 12, 12]
    [3, 12, 5]
    On voit qu'avec set(), l'ordre des nombres n'est pas forcément préservé. S'il fallait respecter l'ordre, il faudrait une petite boucle, mais ce n'est pas compliqué non plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    L4 = []
    for elem in L2:
        if elem not in L4:
            L4.append(elem)
    print(L4)
    Ce qui donnerait:

    merci beaucoup , la récursivité et hétérogénéité, votre aide m'aide toujours et m'apprend des nouveaux réflexe ,

  7. #7
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Voir ma proposition au dessus.
    un autre soucis , l'ordre des éléments et la structure initial est importante exemple :
    L= [6, [13],[13,5]]
    après avoir fait l'aplati et le set
    1 [6, [13],(13,5)]
    2 [6, 13,13,5]
    3 [13, 6,5]
    le résultat souhaité est [6,(13,5)] alors que le résultat en 3 est fausse

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par FATENMRABET Voir le message
    le résultat souhaité est [6,(13,5)] alors que le résultat en 3 est fausse
    Tyrtamos vous a donné la solution mais plutôt que d'essayer de comprendre ce qu'il vous raconte vous vous êtes contentée de recopier le code qu'il vous a donné

    C'est une des raisons pour lesquelles j'en donne peu: vous voulez juste qu'on bosse à votre place.

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

  9. #9
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Tyrtamos vous a donné la solution mais plutôt que d'essayer de comprendre ce qu'il vous raconte vous vous êtes contentée de recopier le code qu'il vous a donné

    C'est une des raisons pour lesquelles j'en donne peu: vous voulez juste qu'on bosse à votre place.

    - W
    non c'est pas vrai lorsque tu m'as dit que je dois aplatir j'ai chercher et essayer à faire ça moi même puis tyramos m'a appris la façon de faire la récursivité j'ai essayer de faire ça dans mon code puis j'ai essayer à preserver la liste intial et j'ai utiliser le zip que tyrtamos m'as signalé au pré-avant, et lorsque j'ai pas trouver de solution j'ai voulu savoir y a t'il une fonction prédéfinis au lieu que je pert le temps alors que ça peut êtres des fonctions prédéfinis qu'à travers ce forums que je les découvre , fromkeys, set, zip, a.any.all, iteartools......

  10. #10
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Tyrtamos vous a donné la solution mais plutôt que d'essayer de comprendre ce qu'il vous raconte vous vous êtes contentée de recopier le code qu'il vous a donné

    C'est une des raisons pour lesquelles j'en donne peu: vous voulez juste qu'on bosse à votre place.

    - W
    et puis mon problème n'est pas l'ordre puisque j'ai traiter ça , mais la structure

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Citation Envoyé par FATENMRABET Voir le message
    puis j'ai essayer à preserver la liste intial et j'ai utiliser le zip que tyrtamos m'as signalé au pré-avant,
    La solution proposée par Tyrtamos n'utilise pas "zip".

    Citation Envoyé par FATENMRABET Voir le message
    j'ai pas trouver de solution j'ai voulu savoir y a t'il une fonction prédéfinis au lieu que je pert le temps alors que ça peut êtres des fonctions prédéfinis qu'à travers ce forums que je les découvre , fromkeys, set, zip, a.any.all, iteartools......
    Le jour où vous viendrez ici en montrant un code qui marche et manifesterez la curiosité de savoir comment faire mieux...

    Citation Envoyé par FATENMRABET Voir le message
    et puis mon problème n'est pas l'ordre puisque j'ai traiter ça , mais la structure
    Ce qui veut dire que vous n'avez même pas pris le temps de décrire correctement le problème à résoudre.

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

  12. #12
    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
    Citation Envoyé par FATENMRABET Voir le message
    et puis mon problème n'est pas l'ordre puisque j'ai traiter ça , mais la structure
    Si la structure doit être conservée, ce n'est plus le problème initial: reposez le problème plus complètement pour qu'on le comprenne bien (et cet effort conduit souvent à mieux comprendre soi-même). Et en fonction des codes déjà vus plus haut, essayez de proposer quelque chose.

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par FATENMRABET Voir le message
    la resultat souhaité est
    lst2=[12,5,3]
    Citation Envoyé par FATENMRABET Voir le message
    3 [13, 6,5]
    le résultat souhaité est [6,(13,5)] alors que le résultat en 3 est fausse
    Deux souhaits (tu nous prends pour les génies de la lampe ?). Le premier c'est une liste de 3 nombres ; et le second est une liste contenant un nombre et un tuple. Le jour où tu sauras ce que tu veux...

    Accessoirement le résultat 3 correspondait quand-même à ton premier souhait (à l'ordre près)...
    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]

  14. #14
    Membre très actif
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour



    Deux souhaits (tu nous prends pour les génies de la lampe ?). Le premier c'est une liste de 3 nombres ; et le second est une liste contenant un nombre et un tuple. Le jour où tu sauras ce que tu veux...

    Accessoirement le résultat 3 correspondait quand-même à ton premier souhait (à l'ordre près)...
    oui c'est exactement ça , la liste que j'ai est parfois une simple liste , parfois liste de liste et de tuple .... voilà c'est dynamique et là j'ai donné exactement le résultat souhaité mais voilà y ceux qui sont vraiment des génies de la lampe et qui capte vite le problème

  15. #15
    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
    faudrait savoir d'où sortent ces données, peut-il y a-t-il moyen de traiter la liste en amont.
    sans connaître les critères de tri, difficile de savoir quoi faire.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 26/04/2014, 14h52
  2. Réponses: 2
    Dernier message: 21/06/2012, 13h51
  3. Réponses: 1
    Dernier message: 25/05/2011, 07h16
  4. récupérer les élements d'une liste (<select>)
    Par ferrero dans le forum Struts 1
    Réponses: 4
    Dernier message: 12/06/2007, 13h55
  5. extraire que les mots avant une virgule
    Par lionski dans le forum Access
    Réponses: 6
    Dernier message: 03/08/2006, 16h19

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