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 :

Enlever des doublons dans une liste


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut Enlever des doublons dans une liste
    Bonjour,
    Je connais la méthode set() pour enlever des doublons dans une liste. Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    a = [(1,2,3,4),(2,3,4,5),(1,2,3,4),(1,2,3,6)]
    a = liste(set(a))
    print a
    qui donne comme sortie: [(2, 3, 4, 5), (1, 2, 3, 4),(1, 2, 3, 6)].

    Ce que je souhaite c'est un tri, mais seulement sur les trois premiers éléments de la liste, avec le quatrième fixé, c'est-à-dire pour reprendre l'exemple ci-dessous, en fixant le quatrième élément à 6, une sortie : [(2, 3, 4, 5),(1, 2, 3, 6)]. Quelqu'un a-t-il une méthode élégante pour faire cela?
    Merci.

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a = [(1,2,3,4),(2,3,4,5),(1,2,3,4),(1,2,3,6),(4,7,8,9),(2,3,4,0),(1,2,3,3),
         (10,3,5,9),(4,7,8,11),(1,2,3,1),(2,3,47,13),(2,3,4,1)]
    li,s = [],set([])
    [ (li.append(y),s.add(y[0:3])) for y in a[::-1] if y[0:3] not in s ]
    print li[::-1]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [(10, 3, 5, 9), (4, 7, 8, 11), (1, 2, 3, 1), (2, 3, 47, 13), (2, 3, 4, 1)]
    S’il sort [(2, 3, 4, 5), (1, 2, 3, 4),(1, 2, 3, 6)]
    à partir de [(1,2,3,4),(2,3,4,5),(1,2,3,4),(1,2,3,6)] ,
    c’est que c’est le dernier rencontré dans la série
    (1,2,3,4),(1,2,3,4),(1,2,3,6) qui est retenu,
    donc le premier si on parcourt dans l’autre sens.
    D’où les [::-1]

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    Merci pour ce code très compact. Quelle modification faut-il y apporter pour qu'il soit possible de choisir quel élément conserver lorsque plusieurs sont trouvés? Par exemple si la liste est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    a = [(1,2,3,'o'),(2,3,4,'o'),(1,2,3,'x'),(2,3,4,'o')]
    la sortie devienne [(1, 2, 3, 'x'), (2, 3, 4, 'o')], c'est-à-dire des deux éléments (1,2,3) on ne conserve que celui finissant par 'x'.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    Pour info, le code suivant fait ce que je veux, mais je suis preneur s'il existe une formulation plus compacte. En voyant le code d'Eyquem, je suis sûr qu'il est possible de faire mieux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    a = [(1,2,3,'o'),(2,3,4,'o'),(1,2,3,'x'),(2,3,4,'o')]
     
    c = [x[:-1] for x in list(set(a))]
     
    e = []
     
    for i in sorted([(x, c.count(x)) for x in set(c)]):
        if i[1] > 1:
            e.append(i[0]+('x',))
        else:
            e.append(i[0]+('o',))
     
    print e
    Sortie: [(1, 2, 3, 'x'), (2, 3, 4, 'o')]

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    oops, avais pas comprite la question ...

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from collections import defaultdict
    d = defaultdict(set)
     
    for x in a:
        d[x[0:3]].add(x)
     
    e = [ k + (('o','x')[1%len(v)],) for k,v in d.iteritems() ]
     
    print e
    J'aime bien le coup du 1%quelque chose qui donne 0 pour quelquechose == 1 et 0 pour toute autre valeur au dessus de 1.
    Et comme on est sûr que len(v) n’est pas nulle puisque k,v existe dans le dictionnaire, c’est bon.

    Comme on passe par un dictionnaire, on perd l’information liée à un ordre. Si cette information compte, il va falloir faire autrement,ou peu plus sophistiqué.


    PS

    Le coup du 1%len(v) est peut être inutile si len(v) ne peut être égale qu’à 1 ou 2.

    De plus une petite simplifiaction d’écriture s’impose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e = [ k + ('ox'[len(v)-1],) for k,v in d.iteritems() ]

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    Merci pour cette réponse compacte qui me plaît plus que mon bête code.

  8. #8
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Peut être cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    a = [(2,5,3,'o'),(1,5,4,'o'),(1,2,3,'x'),(2,3,4,'o')]
    #selection suivant la valeur de la dernière coordonnée
    l=[x for x in a if x[3]=='o'] 
    def cmp(x,y):
        return 100*(x[0]-y[0])+10*(x[1]-y[1])+(x[2]-y[2])
    #ordre lexicologique sur les 3 premières coordonnées
    l.sort(cmp)
    print l
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Je suis paumé là.
    frites.saucisse et eyquem, si j'ai a = [(1,2,3,'x')] vos codes affichent (1,2,3,'o') comme réponse. Est-ce voulu ??
    Quand au code de Zavonen, il faut quelque chose d'entièrement différent...

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

Discussions similaires

  1. [Toutes versions] Gestion des doublons dans une liste technique.
    Par Lorenzogazier dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 02/04/2009, 22h45
  2. [MySQL] Comment éviter des doublons dans une liste déroulante ?!
    Par L'anonyme_connu dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/03/2008, 11h14
  3. Obtenir la liste des doublons dans une table SAS
    Par marie mouse dans le forum SAS Base
    Réponses: 2
    Dernier message: 05/12/2007, 15h33
  4. Enlever les doublons dans une liste
    Par gefrey54 dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 14/09/2007, 17h46
  5. Réponses: 13
    Dernier message: 01/08/2006, 16h59

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