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 :

Créer une liste en python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut Créer une liste en python
    Bonjour à tous,
    Je suis débutante en python ( je code en perl habituellement), mais je dois utiliser scipy et donc apprendre python !

    Alors, comme exemple de ce que je souhaite faire :

    j'ai un fichierA avec des coordonnées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chromosome start stop
    chrA 1114	1121
    qui, en fait, "clusterise" les coordonnées du fichier B ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    chromosome start stop count
    chrA	1114	1115	2
    chrA	1117	1118	2
    chrA	1119	1120	1
    chrA	1120	1121	1
    Et en fait, je voudrais pour chaque cluster dans le fichier A, créer une liste x contenant les start de toutes les coordonnées du fichier B contenu dans le cluster (sachant qu'il faut bien faire attention au chromosome), et une liste y contenant les count de chaque position du fichier B, soit dans l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    X=[1114,1117,1119,11120]
    y=[2,2,1,1]
    Une fois que j'ai ca, je veux faire une interpolation, mais j'ai déjà le code qui fonctionne, il me manque juste à faire mes listes X et Y en parcourant mes fichiers !

    Merci pour vos conseils !

    Je ne sais pas du tout comment m'y prendre, avec perl, j'aurai fais ça avec un hash, mais en python ......

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 55
    Par défaut
    Salut,

    tu peux procéder de la manière suivante:
    tu crées une liste vide:
    X=[]
    with open("input.txt",'r') as f_in:
    #ouvre ton fichier texte avec les droits de lecture
    with open("output.txt",'w') as f_in:
    #ouvre ton fichier texte avec les droits d'ecriture
    for line in f_in:
    list_line=line.split("ton separateur")
    X.append(liste_line[1])

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    J'ai finalement fait comme ceci :
    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
    #!/usr/local/bin/python
     
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import interpolate
     
    cx = open("cDNA_count.txt", "r")
    cluster = open("cluster_on_transcript.txt", "r")
     
     
     
    for row in cluster: # parcours du fichier cluster
    	x=[]
    	y=[]
    	ligne = row.strip().split('\t') 
    	if len(ligne) == 0 :
    		break
    	else :
    		trans=ligne[0]
    		start=ligne[1]
    		stop=ligne[2]
     
    	for rows in cx : # parcours du fichier avec les cx
    		lines = rows.strip().split('\t')
    		if len(lines) == 0 :
    			break
    		else :
    			chrsm=lines[0]
    			startcx=lines[1]
    			stopcx=lines[2]
    			count=lines[3]
    			if trans == chrsm and start <= startcx and startcx <= stop and start <= stopcx and stopcx <= stop:
    				x.append(startcx)
    				y.append(count)
     
    	tck = interpolate.splrep(x,y)
    	xnew = np.arange( np.int(x[0]), np.int(x[len(x)-1]), 0.1)
    	ynew = interpolate.splev(xnew,tck,der=0)
    	yder = interpolate.splev(xnew,tck,der=1)
    	tckder = interpolate.splrep(xnew,yder)
    	print interpolate.sproot(tckder)
     
     
     
    cx.close()
    cluster.close()
    Cependant, comment faire pour que ma valeur de x et y changent à chaque ligne parcourue dans le fichier cluster ?

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    J'ai finalement trouvé la solution :

    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
    #!/usr/local/bin/python
     
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import interpolate
     
     
    cluster = open("cluster_on_transcript.txt", "r")
     
     
    while True :
    	row = cluster.readline() # parcours du fichier cluster
    	print row
    	if row == '' :
    		break
    	else :
    		x=[]
    		y=[]
    		print x
    		print y
    		ligne = row.strip().split('\t') 
    		trans=ligne[0]
    		start=ligne[1]
    		stop=ligne[2]
     
    	cx = open("cDNA_count.txt", "r")
    	for rows in cx : # parcours du fichier avec les cx
    		if rows == '' :
    			break
    		else :
    			lines = rows.strip().split('\t')
    			chrsm=lines[0]
    			startcx=lines[1]
    			stopcx=lines[2]
    			count=lines[3]
    			if trans == chrsm and start <= startcx and startcx <= stop and start <= stopcx and stopcx <= stop:
    				x.append(startcx)
    				y.append(count)
    	print x
    	print y
     
     
    	tck = interpolate.splrep(x,y)
    	xnew = np.arange( np.int(x[0]), np.int(x[len(x)-1]), 0.1)
    	ynew = interpolate.splev(xnew,tck,der=0)
    	yder = interpolate.splev(xnew,tck,der=1)
    	tckder = interpolate.splrep(xnew,yder)
    	print interpolate.sproot(tckder)
    qu'en pensez vous ?

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    Salut Isabelle83.
    Peut-on avoir de vrais fichiers cluster_on_transcript.txt et cDNA_count.txt pour se faire sa propre idée ?
    Ou au moins une partie conséquente de ces fichiers ?

  6. #6
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Bonsoir Isabella,

    En fait, je vois deux points noirs dans ton code*:

    * Tout d’abord, tu fais tes comparaisons de positions sur des chaînes de caractères, et pas des nombres*! Ça doit marcher, mais c’est une solution particulièrement fragile si les données deviennent ne serait-ce que légèrement corrompues/incohérentes, et surtout, c’est horriblement plus lent qu’une comparaison numérique*! Il faudrait donc convertir explicitement tes nombres en int, comme ceci*: trans = int(ligne[0]).

    * Pour chaque ligne de ton cluster, tu reparcours et reparses tout ton fichier de “dna count”*! Alors là, si celui-ci devient un tantinet conséquent (genre 100000 lignes ou plus, avec par ex. 10000 clusters)… Pas besoin de faire un dessin (même avec le cache des fichiers de l’OS).

    En fait, je lirais/parserais une seule fois le fichier DNA, au début, en stockant ses résultats dans un dict (mapping clé->valeur, équivalent python d’un hash perl, si je ne m’abuse), avec par exemple la position de début comme clé. Tant qu’on reste de l’ordre du million de lignes ça reste raisonnable…

    Ou alors, si les enregistrements du fichier cluster et ceux du fichier DNA sont dans le même ordre croissant, ouvrir les deux fichiers au début, et pour chaque cluster, itérer dans les lignes du fichier DNA “juste ce qu’il faut”, c-à-d en s’arrêtant dès que le dernier chromosome du cluster est atteint. C’est probablement la solution la plus performante, même si elle est un peu plus délicate à mettre en œuvre (et présuppose une certaine organisation des données de départ).

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/07/2006, 20h14
  2. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11
  3. Réponses: 3
    Dernier message: 20/02/2006, 18h32
  4. [EXCEL]Créer une liste (combo)
    Par elitost dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/12/2005, 16h55
  5. Réponses: 5
    Dernier message: 29/09/2005, 14h37

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