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 :

Filtrer des sous_listes qui se répètent dans une liste


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut Filtrer des sous_listes qui se répètent dans une liste
    Bonjour,

    Ma question est simple, savoir comment supprimer des listes qui pourrait se répèter dans une liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maListe = [[a,a],[b,b],[a,a],[b,b]]
    et j'aimerai obtenir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maNewList = [[a,a],[b,b]]

  2. #2
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour,
    on peut faire comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    maListe = [['a','a'],['b','b'],['a','a'],['b','b']]
     
    listeNettoyee = []
     
    for x in maListe:
        if x not in listeNettoyee:
            listeNettoyee.append(x)
     
    print listeNettoyee
    Ceci renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [['a', 'a'], ['b', 'b']]

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maListe = [list(x) for x in set(tuple(x) for x in maListe)]
    Somme toutes la fonction de rambc est bien plus efficace.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut
    Bonsoir,

    Comme ça aussi ça marche (c'est un peu du "détournement") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    maListe = [['a','a'],['b','b'],['a','a'],['b','b']]
     
    listeNettoyee,a = [],[]
     
    for L in maListe:
        try:
            a=listeNettoyee.index(L)
        except:
            listeNettoyee.append(L)
     
    print listeNettoyee
    J'avais envie de mettre mon grain de sel...

    @+

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    @yoshik c'est une autre solution, mais pas la meilleure, rambc reste bien loin devant

    fred1599@fred1599-Aspire-5741G:~/Bureau$ python3 test.py
    yoshik : 7.5600000000000005 secondes
    rambc : 1.1499999999999995 secondes
    fred1599 : 4.300000000000001 secondes
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import time
    maListe = [['a','a'],['b','b'],['a','a'],['b','b']]
     
    def yoshik(liste):
        listeNettoyee,a = [],[]
        for L in liste:
            try:
                a=listeNettoyee.index(L)
            except:
                listeNettoyee.append(L)
        return listeNettoyee
     
    def rambc(liste):
        listeNettoyee = []
        for x in liste:
            if x not in listeNettoyee:
                listeNettoyee.append(x)
        return listeNettoyee
     
    def fred1599(liste):
        return [list(x) for x in set(tuple(x) for x in maListe)]
     
    start = time.clock()
    for i in range(1000000):
        yoshik(maListe)
    print("yoshik : {} secondes".format(time.clock()-start))
     
    start = time.clock()
    for i in range(1000000):
        rambc(maListe)
    print("rambc : {} secondes".format(time.clock()-start))
     
    start = time.clock()
    for i in range(1000000):
        fred1599(maListe)
    print("fred1599 : {} secondes".format(time.clock()-start))

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut
    Re,

    Oui, j'en étais bien persuadé d'avance : trop d'appels à la liste... ;-)
    C'était juste parce que un peu atypique.

    @+

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut Simple
    lepuree=dict(ldata).items()

  8. #8
    Membre Expert 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
    Par défaut
    J'adore.

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    analyse de la fonction rambc :
    temps : 10.79 secondes
    analyse de la fonction tyrtamos_while :
    temps : 13.1 secondes
    analyse de la fonction MClaveau :
    temps : 16.979999999999997 secondes
    analyse de la fonction tyrtamos :
    temps : 23.140000000000008 secondes
    analyse de la fonction pausekawa :
    temps : 33.08999999999999 secondes
    analyse de la fonction fred1599 :
    temps : 41.05 secondes
    analyse de la fonction yoshik :
    temps : 73.14 secondes

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lepuree=dict(ldata).items()
    C'est une solution très élégante pour traiter les exemples donnés, mais il faut impérativement que dans les couples, les 2 éléments soient identiques (comme ('a','a')).

    En effet, dans la conversion en dict, le couple ('x','y') est transformé en {'x':'y'}. Donc, s'il y a des couples comme [('a','b'),('a','c')], alors ce sont les doublons de clés qui seront éliminés => [('a','c')]

    Tyrtamos

  11. #11
    Membre Expert 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
    Par défaut
    Oui, cela ne s'applique qu'à des paires mais c'est frais et répond à l'exemple de la question d'origine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maListe = [[a,a], [b,b], [a,a], [b,b]]
    Ceci dit quel intérêt d'avoir des listes de paires ?
    est bien plus simple (et set fonctionne).
    Erreur d'énoncé ? C'est a kali38 de nous dire.

    Pour moi cela répond à la question (et uniquement dans ce cas).

    @+

  12. #12
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour.

    Que de réponses pour une question a priori simple...

    J'ai deux questions :
    1. Comment la liste est-elle construite ? Souvent on oublie que l'on peut lors de la fabrication de la liste se charger des doublons.
    2. Quelle est la taille de la liste ? Pour de grandes listes, il existe une tactique : faire une liste de sous-liste, lesquelles sous-listes ont des points en commun. Ses points communs sont à définir au cas par cas.

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/07/2014, 13h21
  2. Réponses: 0
    Dernier message: 07/11/2013, 15h39
  3. Réponses: 1
    Dernier message: 09/04/2011, 15h08
  4. Réponses: 3
    Dernier message: 18/11/2008, 09h38
  5. Réponses: 13
    Dernier message: 27/11/2007, 11h06

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