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 :

Aide sur les dictionnaires


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Aide sur les dictionnaires
    Bonjour à tous,

    J'ai fait un petit script qui déconne un peu et je pense savoir d'ou vient l'erreur mais je n'arrive pas à la corriger....

    Voici le 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    def cherchefreq(file1,file2,file3):
    	f1=open(file1,'r')
    	f2=open(file2,'r')
    	f3=open(file3,'r')
    
    		
    	lines1=f1.readlines()
    	linee=f2.readline()
    	lines2=f2.readlines()
    	lineee=f3.readline()
    	lines3=f3.readlines()
    	genes={}
    	lib={}
    	tag={}	 
    	
    	for line1 in lines1:
    		l1=line1.split()
    		tags=l1[1].split(',')
    		genes[l1[0]]=tags
    	print genes
    	for line2 in lines2:
    		l2=line2.split()
    		tag[l2[0]]=[l2[1],l2[2]]
    	print tag
    	for line3 in lines3:
    		l3=line3.split()
    		lib[l3[0]]=[l3[5],l3[6],l3[2]]
    
    	print lib
    			
    	genesval={}
    	dict1={}
    	for j in lib.keys():
    		dict1.__setitem__(j,0)
    	
    		
    	for i in genes:
    		genesval[i]=dict1
    
    	print genesval
    	print genesval.keys()
    	print genesval['GENE1']
    	for i in genes.keys():
    		for l in range(len(genes[i])):
    			thetag=genes[i][l]
    			if thetag in tag.keys():
    				print thetag
    				library=tag[thetag][0]
    				print library
    				freq=tag[thetag][1]
    				if library in lib.keys():
    					genesval[i][library]+=int(freq)
    
    				else:
    					continue
    		
    			else:
    				continue
    
    	print genesval
    	f1.close()
    	f2.close()
    	f3.close()
    	return
    ##########################
    J'ai mis en gras là ou ca coince !
    en fait le dict que j'obtiens à la fin ressemble à ca :
    {'GENE1': {'1': 3, '3': 0, '2': 0, '5': 2, '4': 0}, 'GENE2': {'1': 0, '3': 0, '2': 0, '5': 0, '4': 6}, 'GENE3': {'1': 0, '3': 0, '2': 0, '5': 0, '4': 0}, 'GENE4': {'1': 0, '3': 0, '2': 0, '5': 0, '4': 0}, 'GENE5': {'1': 0, '3': 0, '2': 0, '5': 0, '4': 0}}

    et quand par exemple la boucle doit ajouter 3 à la bibliothèque 2 du gène 3, elle le rajoute également à la bibliothèque 2 de tous les gènes! je pense que ca vient du fait que tous les valeurs des clès du dictionnaire genesval sont égales à la même valeur à savoir dict1(cf en gras)....

    Merci de votre aide

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    C'est un problème de référence. Effectivement tous les dictionnaires sont des références vers dict1. Si tu veux éviter cet effet de bord, il faut faire une copie à chaque fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	for i in genes:
    		genesval[i]=dict1.copy()
    Attention tout de même, ce n'est pas une copie profonde (ça te donne un dictionnaire contenant des références vers les éléments de dict1).
    Si tu veux une copie profonde il faut utiliser copy.deepcopy

Discussions similaires

  1. besoin d'aide sur les ORB
    Par floorfille dans le forum CORBA
    Réponses: 4
    Dernier message: 24/08/2004, 15h43
  2. Aide sur les groupes (ADO)
    Par portu dans le forum QuickReport
    Réponses: 3
    Dernier message: 18/08/2004, 16h13
  3. Filemaker ... besoin d'aide sur les Plugin
    Par joange dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 22/04/2004, 10h16
  4. Petite aide sur les triggers ?
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/04/2004, 16h28
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19

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