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 :

Récupérer les doublons d'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 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut Récupérer les doublons d'une liste
    Bonjour,

    je suis bloqué depuis un moment sur la marche à suivre pour extraire des chaines de caractères (non uniques) et leurs IDs associés.

    J'ai un fichier de données qui se présente ainsi:
    JZFJIZJDZJ A
    ZDJZZFJZIZ A
    ZFKZOFZJK B
    ZFJZFOPZF B
    KFZOFJZFZ B
    FIOZJOFIJZ C
    Les IDs ne sont pas uniques, et les chaines de caractères non plus. J'essaie de récupérer chaque chaine de caractère de mon fichier avec tous les IDs possibles qui lui sont associés.

    Par exemple on peut imaginer qu'à JZFJIZJDZJ soient associés les IDs A,B et C.

    J'ai commencé par créer 2 listes, une contenant mes chaines de caractères, l'autre mes IDs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pattern = []
    noms = []
    for i,el in enumerate(fichier.readlines()):
    	col = el.split('	')
    	pattern.append(col[0])
    	noms.append(col[1].strip(('\n')))
    Je tente ensuite de les parcourir toutes les deux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i,j in zip(pattern,noms):
    	if i==i: #test du désespoir
    		print i
    Mais je n'arrive pas à tester la condition selon laquelle j'ai des doublons. Je veux récupérer ma première chaine et tous ses doublons pour pouvoir récupérer les IDs (comme l'exemple ci dessus) et ainsi de suite jusqu'à avoir parcouru tout mon fichier.

    Si quelqu'un a une idée sur la stratégie à mettre en place j'avoue que je ne vois pas. J'ai voulu passer par les dictionnaires mais j'ai un problème de clés étant donné qu'il n'y a pas de chaine de caractères (ou d'IDs) uniques.


    Merci à vous

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Je te propose une solution avec un dictionnaire, ayant pour clés les chaînes et pour valeurs des listes d'ID associés à chaque chaîne.
    Un truc du genre :
    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
     
    Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
    [GCC 4.4.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> inputs = ("JZFJIZJDZJ A", "ZDJZZFJZIZ A", "ZFKZOFZJK B", "ZFJZFOPZF B", "KFZOFJZFZ B", "FIOZJOFIJZ C")
    >>> inputs
    ('JZFJIZJDZJ A', 'ZDJZZFJZIZ A', 'ZFKZOFZJK B', 'ZFJZFOPZF B', 'KFZOFJZFZ B', 'FIOZJOFIJZ C')
    >>> inputs = [i.split() for i in inputs] # je découpe selon l'espace
    >>> inputs
    [['JZFJIZJDZJ', 'A'], ['ZDJZZFJZIZ', 'A'], ['ZFKZOFZJK', 'B'], ['ZFJZFOPZF', 'B'], ['KFZOFJZFZ', 'B'], ['FIOZJOFIJZ', 'C']]
    >>> result = dict() # j'initialise un dico vide
    >>> for string, id in inputs: # j'itère sur mes couples (chaîne, ID)
    ...     if string not in result: # si le dico n'a pas encore d'entrée pour cette chaîne, on l'initialise avec une liste vide
    ...             result[string] = []
    ...     result[string].append(id) # on ajoute l'iD dans la liste
    ...
    >>> result
    {'FIOZJOFIJZ': ['C'], 'ZFKZOFZJK': ['B'], 'KFZOFJZFZ': ['B'], 'JZFJIZJDZJ': ['A'], 'ZDJZZFJZIZ': ['A'], 'ZFJZFOPZF': ['B']}
    Bon apparemment ton exemple d'entrées n'était pas bon, car là tes chaînes sont uniques contrairement à ton énoncé.
    mais avec un meilleur exemple, ça marche.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut
    Merci pour votre solution, en effet désolé pour mon exemple je vais en redonner un plus concret:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    AAAAA  1
    AAAAA  2
    BBBBB  1
    ABCBA  1
    CCCCC  3
    Je vais essayer d'adapter votre code. Le problème là c'est que comme j'ai des chaines qui sont semblables mon dictionnaire se limite à toutes les valeurs uniques, et du coup je ne récupère qu'un seul ID par chaine.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Pour ce dernier exemple, mon code te donnera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> result
    {'AAAAA': ['1', '2'], 'ABCBA': ['1'], 'CCCCC': ['3'], 'BBBBB': ['1']}
    Ce n'est pas ce que tu souhaites ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut
    EDIT: je suis juste stupide, j'avais mal indenté la dernière ligne du code. Merci beaucoup pour votre aide

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    [edit] tu as supprimé ta question, mais je laisse la réponse pour d'autres :-) [/edit]


    AAAA' n'est pas crée deux fois dans le dico.
    ce qu'on fait :
    Quand on rencontre 'AAAA' on regarde s'il est déjà dans le dico.
    - Non ?
    -> on crée la clé 'AAAA' avec comme valeur une liste
    -> on aoute dans cette liste l'ID (correspondant donc au premier 'AAAA' rencontré
    - Oui ?
    -> on se contente d'ajouter à la liste d'iD (créee la première fois qu'on a rencontré 'AAAA', voir ci-dessus) l'ID supplémentaire.

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

Discussions similaires

  1. [C# 2.0] Détecter les doublons dans une List<string>
    Par Rodie dans le forum Windows Forms
    Réponses: 36
    Dernier message: 30/03/2013, 15h21
  2. [XSLT] probleme avec les doublons dans une liste deroulante
    Par mikooo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 02/04/2007, 15h37
  3. Réponses: 4
    Dernier message: 13/11/2006, 17h49
  4. Récupérer les données d'une liste dans un $_POST
    Par Sangdrax1604 dans le forum Langage
    Réponses: 4
    Dernier message: 19/10/2006, 10h55
  5. Réponses: 10
    Dernier message: 19/09/2006, 03h15

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