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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 746
    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 746
    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
    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

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

  5. #5
    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

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 746
    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 746
    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

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    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]

  8. #8
    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:


  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 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 ,

+ 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