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 :

ajout de valeurs dans dictionnaire existant


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Octobre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 14
    Points : 10
    Points
    10
    Par défaut ajout de valeurs dans dictionnaire existant
    Bonjour,

    J'ai plusieurs fichiers que je dois comparé pour en faire une sorte de catalogue. J'ai un fichier transformé en dictionnaire et je souhaite ajouter une nouvelle valeur quand la clef est identique.
    exemple :

    Fichier1
    4 AGCAGGG
    5 TGCAGGT
    26 TGCAGGG
    30 TGCAGGC
    44 TGCACGT
    47 TGCAGGA

    Fichier 2
    14 AGCAGGG
    15 AGCAGGT
    126 TGCAGGG
    130 TGCAGGC
    144 TGCACGT
    147 TGCAGGA
    148 AGCAGGA

    Je souhaite avoir un dictionnaire avec comme clef la seq et comme valeurs l’identifiant du fichier1 et/ou identifiant di fichier 2
    AGCAGGG 4_F1 14_F2
    TGCAGGT 5_F1
    TGCAGGG 26_F1 126_F2
    TGCAGGC 30_F1 130_F2
    TGCACGT 44_F1 144_F2
    TGCAGGA 47_F1 147_F2
    AGCAGGT 15_F2
    AGCAGGA 148_F2

    Certaines clefs auront 2 valeurs tandis que d’autres n'auront qu'une seule valeur (celle du fichier 1 ou du fichier2).

    Voici ce que j'ai essayé comme script :
    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
     
    #!/usr/bin/env python
    #-*- coding: latin-1 -*-
     
    F1 = open("fichier1" ,"r")
    F2 = open("fichier2" ,"r")
    catalog=open("catalog","w")
     
    liste_F1=[]
    liste_F2=[]
     
    dico_F1 = {}
    dico_F2 = {}
     
     
    for f1 in F1.readlines():
    	liste_F1 = f1.strip().split('\t')
    	num = liste_F1[0]+"_F1"
    	seq = liste_F1[1]
    	dico_F1 [liste_F1[1]]= liste_F1[0]+"_F1"
     
    	lib_seq_F1 = sorted(dico_F1.keys())
     
    	for f2 in lines:
    		liste_F2 = f2.strip().split('\t')
     
    		dico_F2 [liste_F2[1]]= liste_F2[0]+"_F2"
    J'ai ensuite testé 2 méthodes : une sur dictionnaire qui ne fonctionne pas et une sur des listes que je transformerai en dictionnaire et qui fonctionne presque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    #Test sur dictionnaire :
    		if dico_F2 [liste_F2[1]]== dico_F1 [liste_F1[1]]:
    			#dico_F2 [liste_F2[1]].append( dico_F1 [liste_F1[0]])  ne fonctionne pas
    			catalog.write(dico_F2 [liste_F2[1]]+ "\t" + dico_F2 [liste_F2[0]]+ "\t" + seq + "\n" )
    		else :
    		catalog.write(dico_sexy [liste_F2[1]]+ "\t" + dico_F2 [liste_F2[0]]+ "\t" + "\n" )
     
    #il ne doit pas reconnaitre la condition car soit le fichier catalog est vide (quand je fais la condition if toute seule), soit j’ai une erreur : error key14 (if +else)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #Test sur liste pour la transformer en dictionnaire : 
    		if liste_F2[1]== liste_F1[1]:
    			catalog.write(liste_F2[1] + "\t" + liste_F2[0]+"_F2" + "\t" + num + "\n" )
    #cette condition fonctionne
     
     
    		elif liste_F2[1]!= liste_F1[1]:
    			catalog.write(liste_F2[1] + "\t" + liste_F2[0]+"_F2" + "\t" +"\n")
    			catalog.write(liste_F1[1] + "\t"  + "\t"+ liste_F1[0]+"_F1" + "\n")
    #cette condition ne fonctionne pas, la suivante non plus
     
    else :
    			catalog.write(liste_F2[1] + "\t" + liste_F2[0]+"_F2" + "\t" +"\n")
    Désolé pour le message un peu long et merci de votre aide

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    salut,

    quelque chose comme ça pourrait convenir ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import json
     
    filenames = ['fichier1.txt', 'fichier2.txt']
    dico = {}
     
    for fichier in filenames:
        with open(fichier, 'r') as f:
            for line in f.xreadlines():
                nb,seq = line.rstrip().split()
                if seq not in dico.keys():
                    dico[seq] = {}
                dico[seq][fichier] = int(nb)
    print json.dumps(dico, sort_keys=True, indent=3)
    et le résultat :
    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
    {
       "AGCAGGA": {
          "fichier2.txt": 148
       },
       "AGCAGGG": {
          "fichier1.txt": 4,
          "fichier2.txt": 14
       },
       "AGCAGGT": {
          "fichier2.txt": 15
       },
       "TGCACGT": {
          "fichier1.txt": 44,
          "fichier2.txt": 144
       },
       "TGCAGGA": {
          "fichier1.txt": 47,
          "fichier2.txt": 147
       },
       "TGCAGGC": {
          "fichier1.txt": 30,
          "fichier2.txt": 130
       },
       "TGCAGGG": {
          "fichier1.txt": 26,
          "fichier2.txt": 126
       },
       "TGCAGGT": {
          "fichier1.txt": 5
       }
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Octobre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci pour la réponse. Je suis novice donc ce module est inconnu pour moi.

    Ça pourrait répondre en partie car en effet j'ai bien toutes les informations et elles sont bien différenciées.
    Par contre, la sortie a l'air "figée" avec un format " seq" :{ fichier1, fichier2} et donc il doit être difficile de faire des tests sur cette sortie.

    exemple, si valeur ==2 (c'est à dire contient fichier 1 et 2) alors on écrit la séquence + les nb dans un autre fichier
    ou si valeur ==1 (fichier 1 ou fichier2) on compare les séquences deux à deux et on regarde le nombre de motif différents et à quelle position

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    Citation Envoyé par iguanic Voir le message
    Merci pour la réponse. Je suis novice donc ce module est inconnu pour moi.
    si tu parles du module json dans le bout de code que j'ai mis il ne sert qu'à présenter les données, l'accès lui se fait à travers dico['AGCAGGG']['fichier1.txt'] par exemple

    Par contre, la sortie a l'air "figée" avec un format " seq" :{ fichier1, fichier2} et donc il doit être difficile de faire des tests sur cette sortie.
    exemple, si valeur ==2 (c'est à dire contient fichier 1 et 2) alors on écrit la séquence + les nb dans un autre fichier
    ou si valeur ==1 (fichier 1 ou fichier2) on compare les séquences deux à deux et on regarde le nombre de motif différents et à quelle position
    j'ai rien compris

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 739
    Points
    2 739
    Par défaut
    Salut,

    est-ce qu'une même séquence peut apparaitre plusieurs fois dans le même fichier? je pense que oui, mais vaut mieux avoir une confirmation.

    en partant sur mon hypothèse, je te conseillerai de stocker tes résultats dans un dictionnaire. ce dictionnaire aura pour clef les différentes séquences trouvées dans tes fichiers. à chaque clef sera associée un liste qui contiendra les couples (nom_de_fichier, numéro) de chaque occurence.
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {
        séquence_1: [(fichier_1, indice_11), (fichier_1, indice_12), (fichier_2, indice_21)],
        séquence_2: [(fichier_1, indice_13)],
        séquence_3: [(fichier_2, indice_22)],
        séquence_n: ...
    }
    pour remplir ce dictionnaire, tu pourrais t'y prendre comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    instancier le dictionnaire vide
    pour chaque fichier:
        pour chaque ligne du fichier en cours:
            récupérer l'indice et la séquence
            si la sequence n'est pas présente dans les clefs du dictionnaire:
                ajouter la clef au dictionnaire avec une liste contenant uniquement le couple (nom_de_fichier, indice) comme valeur
            sinon (la séquence est déjà présente dans les clefs du dictionnaire):
                ajouter le couple (nom_de_fichier, indice) à la liste du dictionnaire associée à la séquence
    au final, et si j'oublie rien, tu devrais avoir un dictionnaire correctement rempli
    c'est ce que fait le code de BufferBob à ceci près, que cet algo pourra accepter plusieurs référence à la même séquence dans un même fichier.

  6. #6
    Membre à l'essai
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Octobre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Normalement chaque séquence est unique au sein d'un même fichier.

    Dans le script de Tryph, ça permet juste de te couvrir au cas ou une séquence est présente plusieurs fois. Même si ce n'est pas le cas, cela fonctionnera.

    Le code de bufferbob arrive au même résultat (à condition d'avoir une séquence unique) mais j'avoue que j'ai du mal à comprendre comment car il ne gère que des exceptions et ne met pas de condition (si la seq fichier1 = sequence fichier2 ...)

    Merci pour vos réponses

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 739
    Points
    2 739
    Par défaut
    Citation Envoyé par iguanic Voir le message
    Le code de bufferbob arrive au même résultat (à condition d'avoir une séquence unique) mais j'avoue que j'ai du mal à comprendre comment car il ne gère que des exceptions et ne met pas de condition (si la seq fichier1 = sequence fichier2 ...)
    la condition est bien là, mais peut être sous la forme ou tu t'attends à la voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if seq not in dico.keys():
    cette condition vérifie si seq est absent de clefs du dictionnaire, on pourrait la traduire presque mot à mot par "si seq n'est pas dans les clefs de dico".
    ça évite d'avoir à boucler sur dico pour vérifier chacune des clefs qu'il contient.
    si la condition est vraie, il crée la clef et lui associe un (sous)dictionnaire vide. à la ligne suivante il peut remplir le (sous)dictionnaire qui existe forcément.

  8. #8
    Membre à l'essai
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Octobre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    C'est bizarre, il a du changer son code car j'avais copié :

    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
     
    import json
     
    filenames = ['fichier1', 'fichier2']
    dico = {}
     
    for fichier in filenames:
        f = open(fichier, 'r')
        lines = f.readlines()
        for ligne in lines:
            nb, seq = ligne.rstrip().split()
            try:
                dico[seq][fichier] = int(nb)
            except:
                dico[seq] = {}
                dico[seq][fichier] = int(nb)
     
        f.close()
    print json.dumps(dico, sort_keys=True, indent=3)
    C'est pour cette raison que je parlais d'exception et d'absence de condition.
    Je suis sur de ne pas avoir modifié son code à moins que je ne sois entré dans un état de transe ....

    Le nouveau code est beaucoup plus clair pour moi.

    Merci beaucoup car sans ta réponse je n'aurai pas remarqué la modification

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    Dernière modification par BufferBob ; Aujourd'hui à 11h35.
    ça aurait pu te mettre sur la piste

    néanmoins chaque version était valide et donnait rigoureusement le même résultat, il s'agissait juste d'être un peu plus clair comme tu l'as fait remarquer, voire plus efficace

    à l'origine plutôt qu'une condition j'essayais simplement d'affecter la valeur, si ça levait une exception alors j'initialisais le dico avant d'affecter la valeur (tu auras noté que c'est un dictionnaire de dictionnaires)

    par contre j'ai toujours pas compris ce qui te chagrinait plus haut, c’était juste une affaire de présentation/d'affichage où plus embêtant ?

  10. #10
    Membre à l'essai
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Octobre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Je n'ai pas vu l'horaire de la modification.
    Après test, il ne s'agit que de l'affichage donc ce n'est pas grave du tout.
    Je peux réaliser les tests voulus, récupérer d'autres sorties et faire d'autres affichages donc c'est parfait.

    Merci

  11. #11
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 739
    Points
    2 739
    Par défaut
    Salut,

    dans le cas présent, je trouve la version avec une condition effectivement plus claire et plus adaptée.

    mais pour infos, sache qu'en Python, contrairement à d'autre langages, on estime qu'il est parfois plus pratique/souhaitable d'essayer d'effectuer une action et de réagir correctement en cas d'erreur, que de vérifier les conditions qui permettent d'effectuer une action avant de réellement la faire.
    certains disent pour justifier ça qu' "il est plus simple de demander pardon qu'une permission", ce qui n'est pas faux dans certains cas.

    du coup, tu peux effectivement trouver des cas en Python ou on aura préféré tenter une action et traiter une éventuelle erreur plutôt que de faire de vérification pour s'assurer que l'action est effectivement réalisable. dans un cas ou il faut faire de multiple vérifications, le clarté du code peut effectivement en être améliorée.

Discussions similaires

  1. Ajouter une valeur dans un listview
    Par aliwassem dans le forum Composants VCL
    Réponses: 1
    Dernier message: 25/01/2006, 22h15
  2. VBA : ajouter une valeur dans une liste déroulante
    Par remi59 dans le forum Access
    Réponses: 4
    Dernier message: 22/12/2005, 10h01
  3. ajouter une valeur dans une combobox
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 17/10/2005, 10h58
  4. Ajouter un valeur dans une liste modifiable
    Par ancylia dans le forum Access
    Réponses: 1
    Dernier message: 22/09/2005, 12h50
  5. [Tableaux]Ajouter des valeurs dans un tableau
    Par Antoine1183 dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 03/04/2005, 13h41

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