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 :

Listes : tri, suppression des doublons,"triplons" et compte


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Listes : tri, suppression des doublons,"triplons" et compte
    Bonjour,

    Je dispose de 2 Listes, Lf et Li, composées chacune de groupes de 4 lettres (plusieurs milliers) en plusieurs "exemplaires" parfois dans chacune.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> Lf=['ACBD', 'AABB', 'ABBB','ACBD','ACBD','ABBB']
    >>> Li=['ACBD', 'AAAB', 'AABB','ACBD','ACBD','AABB']
    Je voudrais fondre ces deux listes en une liste de tuples (triés) en éliminant les doublons et en gardant le nombre total d'exemplaires de chaque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Lt=[('AAAB',1),('AABB',3),('ABBB',2),('ACBD',6)]
    J'ai trouvé :
    - comment éliminer les doublons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     >>> Lt= list(set(Lf))
    Lt.sort()
    ,
    - je saurais compter le nombre d'occurences de chaque groupe dans chaque fichier...

    Mais je ne sais pas comment combiner les deux, alors j'ai créé une fonction:
    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
     
    def tri_et_compte(Lf, nb):
        no,L=0,[]
        for i in xrange(nb):
            x1,x2,x3=Lf[i-1],Lf[i],Lf[i+1]
            if x2 == x3:
                no+=1
            else:
                if x2 == x1:
                    no+=1
                    L.append((x2,no))
                    no=0
                else :
                    L.append((x2,1))
                    no=0
        nl=len(L)
        return L,nl 
     
    Lf=['ACBD', 'AABB', 'ABBB','ACBD','ACBD','ABBB']
    Li=['ACBD', 'AAAB', 'AABB','ACBD','ACBD','AABB']
    Lf+=Li
    Lf.sort()
    nbl=len(Lf)  
    Lf.append('>>>>')
    L=[]
    L,nl=tri_et_compte(Lf,nbl)
    print L
    Mais je trouve ça lourd, emprunté et "naïf"... Alors je me dis qu'il y a certainement plus sioux et plus rapide...

    Donc, vos suggestions sont les bienvenues...

    Merci d'avance

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    en passant par une liste intermédiaire et en utilisant une list comprehension:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Lf = ['ACBD', 'AABB', 'ABBB','ACBD','ACBD','ABBB']
    Li = ['ACBD', 'AAAB', 'AABB','ACBD','ACBD','AABB']
    Ltemp = Li+ Lf
    Lt = sorted([(x, Ltemp.count(x)) for x in set(Ltemp)])
    print Lt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [('AAAB', 1), ('AABB', 3), ('ABBB', 2), ('ACBD', 6)]

  3. #3
    Membre éclairé Avatar de ctiti60
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 75
    Par défaut
    Salut,

    Et pourquoi ne pas utiliser un dictionnaire au lieu d'une liste de tuples ?
    Si tu trouves la clé, tu incrémentes le compteur contenu dans la valeur, sinon tu ajouter une nouvelle entrée.

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

    Réponses rapides... très rapides ! Merci...
    Oui ça marche bien...
    @Pacificator...
    Je vais compliquer un peu la question, parce qu'en fait je veux travailler avec une dizaine de fichiers de plusieurs milliers de "lignes" et j'avais pensé que tout charger en même temps pouvait me faire manipuler 150.000 voire 200.000 groupes de 4 lettres. Je pensais donc utiliser ta suggestion pour déjà donner à chaque liste la structure de liste de tuples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Lf=[('B',5),('C',1),('A',3)]
    Li=[('A',7),('C',1),('D',3),('B',1)]
    LTemp=Lf+Li
    Mais comment adapter ta méthode pour que, avec les tuples (a,b) et (c,d), on puisse, d'une seule passe, supprimer (c,d) de Ltemp, si a==c et en même temps temps remplacer (a,b) par (a,b+d) ?

    Merci d'avance

    @+

  5. #5
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Peut-être un dictionnaire serait plus à propos pour ce traitement.
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  6. #6
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Tout dépend des ressources dont tu disposes et de la fréquence de ton traitement.
    Fais un test avec toutes tes données et tu verras si tu as besoin d'optimiser (ou pas).

  7. #7
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Si c'est pour plusieurs milliers de lignes, et si tu utilise une 2.x, t'as le module bsddb qui est une base de donnée très simple qui s'utilise comme un dictionnaire, sauf que ça encombre beaucoup moins la mémoire. tout est est très bien expliqué dans les docs en ligne de python.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/07/2009, 10h06
  2. suppression des doublons
    Par LuckySoft dans le forum Requêtes
    Réponses: 9
    Dernier message: 04/08/2006, 12h29
  3. Recherche et tri sur des doublons XSLT
    Par MusSDev dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 01/06/2005, 09h27

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