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

  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.

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 080
    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 080
    Par défaut
    @valAa

    Je suis d'accord avec toi, solution correcte, selon l'énoncé du PO.

    @RTK45

    1) Enoncé du début incorrect, car il ne donne pas les cas exceptionnels.
    2) Pourquoi el.split(' ') au lieu de el.split() ?
    3) Est-ce que dans chaque ligne, tu rencontres qu'une chaîne et qu'un seul ID?
    4) Plus propre serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pattern, nom = [], []
    lines = [line.strip('\n') for line in f.readlines()]
    for line in lines:
        chaine, id = line.split()
        pattern.append(chaine)
        nom.append(id)
    Mais bon après t'es embêté, donc ça reste une solution de bricolage, et donc difficilement maintenable.
    5) Qu'est-ce qui va pas dans la solution de valAa?

  8. #8
    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
    1) Enoncé du début incorrect, car il ne donne pas les cas exceptionnels.
    mea culpa, j'ai ajouté un autre exemple plus concret après.

    2) Pourquoi el.split(' ') au lieu de el.split() ?
    C'est une erreur de ma part, enfin disons que jusqu'à maintenant j'employais la méthode étudiée en cours, en effet el.split() marche très bien.

    3) Est-ce que dans chaque ligne, tu rencontres qu'une chaîne et qu'un seul ID?
    Oui.

    4) Plus propre serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pattern, nom = [], []
    lines = [line.strip('\n') for line in f.readlines()]
    for line in lines:
        chaine, id = line.split()
        pattern.append(chaine)
        nom.append(id)
    En effet, merci pour votre solution .

    5) Qu'est-ce qui va pas dans la solution de valAa?
    Rien, la première fois j'avais mal interprété le code et je l'avais donc mal appliqué, cette solution est bien fonctionnelle

+ 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