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 :

Problème de programmation en Python


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut Problème de programmation en Python
    Bonjour,

    J'ai un projet à faire en python, et je suis bloquée à 2 endroits dans mon code.

    1ère partie :

    Je dois, grâce à des expressions régulières, rechercher dans un fichier cette sequence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            1 agaattcgtc ttgctctatt cacccttact tttcttcttg cccgttctct ttcttagtat
           61 gaatccagta tgcctgcctg taattgttgc gccctacctc ttttggctgg cggctattgc
          121 cgcctcgtgt ttcacggcct cagttagtac cgttgtgacc gccaccggct tggccctctc
          181 acttctactc ttggcagcag tggccagctc atatgccgct gcacaaagga aactgctgac
          241 accggtgaca gtgcttactg cggttgtcac ttgtgagtac acacgcacca tttacaatgc
          301 atgatgttcg tga
    Puis, une fois cette partie du fichier extraite, je ne dois récupérer que les bases que je veux mettre dans une liste pour avoir une liste telle que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste1=['a','g','a','a','t','t','c','g','t','c','t','t','g',....]
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    liste_seq=[]
    seqADN=[]
    for i in fichier:
    	#affiche toute la sequence
    	seq=re.search("^\s+[0-9]+\s([acgt\s]+)",i)
    	if seq:
    		#recuperer toutes les bases de la sequence
    		liste_seq += seq.group(1)
    		#et les stocker dans une liste
    		seqADN=list(liste_seq)
    		#supprimer les espaces et les retour à la ligne
    		seqADN=seqADN.replace(" ","")
                    seqADN=seqADN.replace("\n","")
    		print seqADN
    J'obtiens donc une liste de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ['a', 't', 'a', 'g', 'a', 'a', 't', 't', 'c', 'g', 't', 'c', 't', 't', 'g', 'c', 't', 'c', 't', 'a', 't', 't', 'c', 'a', 'c', 'c', 'c', 't', 't', 'a', 'c', 't', 't', 't', 't', 'c', 't', 't', 'c', 't', 't', 'g', 'c', 'c', 'c', 'g', 't', 't', 'c', 't', 'c', 't', 't', 't', 'c', 't', 't', 'a', 'g', 't', 'a', 't', 'g']
    comme dans liste1.

    2ème partie :
    En parralèle, j'ai extrait de ce meme fichier, des numéros de début et de fin de gène, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    liste2=[]
    for j in fichier:
    	#affiche tous les genes
    	gene=re.search("^[ \t] +gene +([0-9]+)\..([0-9]+)",j)
    	if gene :
    		#faire une liste de listes avec le debut et la fin de chaque gene
    		liste2.append([gene.group(1),gene.group(2)])
    		print liste2
    La liste obtenue réussie, est de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste2 = [['58','272'],['59','304'],['360','458'],['503','805'],...]

    Le problème est :

    Je dois alors extraire, dans la liste contenant la séquence entière (seqADN ou liste1), les bases (la séquence) correspondantes à chacun des début et fin de gène ci-dessus (liste2).
    C'est-à-dire obtenir un dictionnaire de la forme :
    pour le gène 1 :
    ['58','272'] = {'a','a','t','t','c','g','g','t','t','c','a','a',...}

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in seqADN:
    	for j in liste2:
    		dico[j]=seqADN[i]
           		print seqADN[i]
    Cependant, ça ne marche pas.
    Quelqu'un pourrait-il m'éclaircir ?

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut eh be......
    Salut,

    Y a de quoi s'amuser là....
    Mais j'ai du mal à rentrer dans le problème.

    Je dois, grâce à des expressions régulières, rechercher dans un fichier cette sequence :
    - Es-tu OBLIGÉE de recourir à des expressions régulières (un énoncé, ou un directeur de thèse qui demande ça...)

    - Veux-tu signifier que tu recherche toute séquence similaire, dont la séquence que tu donnes n'est qu'un exemple,
    ou recherches-tu vraiment CETTE séquence précisément ?

    - Est-ce que l'environnement de cette séquence est aussi des suites de bases d'ADN , ou bien est-ce du "texte" ?

    - Chaque ligne est-elle TOUJOURS structurée sur le même schéma:
    un nombre entier positif (quelle valeur max ?) suivi de 6 groupes de 10 bases, avec un blanc comme séparateur ?


    Il doit être possible de se débrouiller sans recourir à ce point aux regex. Tes codes me paraissent extrèmement compliqués. Mais c'est peut être moi qui n'ai pas le niveau.
    J'essaie de commencer par bien cerner les bases du problème.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut
    Tout d'abord, j'ai modifié le premier message, car j'ai réussi les 2 premières listes , il ne reste "plus que" la dernière question, qui là me pose vraiment problème, avec l'association des 2listes précédemment obtenues.

    Alors :

    Citation Envoyé par eyquem Voir le message
    - Es-tu OBLIGÉE de recourir à des expressions régulières (un énoncé, ou un directeur de thèse qui demande ça...)
    oui, le professeur l'exige.

    Citation Envoyé par eyquem Voir le message
    - Veux-tu signifier que tu recherche toute séquence similaire, dont la séquence que tu donnes n'est qu'un exemple,
    ou recherches-tu vraiment CETTE séquence précisément ?
    La séquence que je donne est le début de la vraie séquence que j'ai à chercher, cependant il y a qqminutes, j'ai réussi à la trouver .

    Citation Envoyé par eyquem Voir le message
    - Est-ce que l'environnement de cette séquence est aussi des suites de bases d'ADN , ou bien est-ce du "texte" ?
    Il y avait également du texte avant la séquence.

    Citation Envoyé par eyquem Voir le message
    - Chaque ligne est-elle TOUJOURS structurée sur le même schéma:
    un nombre entier positif (quelle valeur max ?) suivi de 6 groupes de 10 bases, avec un blanc comme séparateur ?
    Non. Les lignes commencent toutes par un chiffre oui (valeux max : 172261), suivi de 6groupes de 10bases sauf pour la dernière ligne : de 2 groupes de 10bases + 1groupe d'1base, avec entre chaque groupe, un espace.

    Citation Envoyé par eyquem Voir le message
    Il doit être possible de se débrouiller sans recourir à ce point aux regex. Tes codes me paraissent extrèmement compliqués. Mais c'est peut être moi qui n'ai pas le niveau.
    J'essaie de commencer par bien cerner les bases du problème.
    C'est fort possible, j'ai toujours tendance à me compliquer un peu la tâche

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    C'est mieux d'utiliser des regex, tu as raison, ou ton prof... Ce serait extrêmement compliqué de faire sans. Par contre, avec les regex, je cherche touours à les faire simples, sans utiliser à fond la puissance de leur subtilité. Je mixe avec l'utilisation des méthodes de strings.
    C'est pour ça que je ne comprends pas ta regex
    " ^[ \t] +([0-9]+) +(([a-z]* +)+) "
    pour moi c'est trop compliqué.
    Il me semble quand même incohérent d'écrire un ensemble [a-z] alors que les lignes recherchées n'ont que les lettres agct.


    Voilà comment j'ai réussi à faire:


    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
    import re
     
    bla = "[0-9]{1,9}( [agct]{10}){0,6}( [agct]{1,10})?"
    sekance = ''
    f = open('adn','r')
    for i in f:
        if re.match(bla,i.lstrip()):
            sekance = sekance + i[:-1].lstrip().partition(' ')[2].replace(' ','')
    f.close()
     
    print 'sekance =',sekance
    liste1 = list(sekance)
    print '\nliste1 =',liste1
    print '\nlongueur de liste1 =',len(liste1)
     
    print '\n----------------------------------------'
     
     
    liste2 = [['58','72'],['279','304']]
    print '\n\nliste2 =',liste2
    # La 58ieme base dans sekance est sekance[57]
     
    dico1 = {}
    dico2 = {}
    for df in liste2:
        cle = df[0] + '-' + df[1]
        d = int(df[0])-1
        f = int(df[1])
        dico1[cle] = sekance[ d : f ]
        dico2[cle] = list(  sekance[ d : f ] )
     
    print '\ndico1 =',dico1
    print '\ndico2 =',dico2

    i[:-1] pour enlever le retour à la ligne

    lstrip() pour enlever les blancs en début de ligne, ça colle à gauche les numéros dans les lignes recherchées, sans aucun blanc avant les chiffres.

    partition(' ')[2] découpe la ligne en trois morceaux autour du premier blanc de la ligne et garde le troisième morceau: ce blanc est entre les chiffres et les premières lettres.

    replace(' ','') enlève les blancs qui restent au milieu des lettres

    Je n'ai pas réussi à utiliser les listes ['58','72'] et ['279','304'] comme clés de dictionnaire. C'est pour cela que les clés sont des strings '58-72' et '279-304'

    Je préfère les séquences de bases sous forme de string 'aggcgtagatgac...' c'est pour cela qu'il y a 2 dicos.


    Je ne comprends pas comment tu peux trouver des séquences avec la regex " ^[ \t] +gene +([0-9]+)\..([0-9]+) " , ce n'est pas les caractères 'gene' qui sont recherchés dans une séquence......


    Le code suivant est obscur pour moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in seqADN:
    	for j in liste2:
    		dico[j]=seqADN[i]
           		print seqADN[i]

    for i in seqADN: chaque i est une base(caractere) de la liste seqADN
    On ne peut donc pas écrire seqADN[i]
    D'autre part, il doit manquer un append () dans l'histoire. Bref....

  5. #5
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Citation Envoyé par Victoria007 Voir le message
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in seqADN:
        for j in liste2:
            dico[j]=seqADN[i]
                   print seqADN[i]
    Cependant, ça ne marche pas.
    Quelqu'un pourrait-il m'éclaircir ?
    Je crois que si cela ne fonctionne pas c'est parce que tu utilises une liste en tant que clé, or, ce n'est pas correct. Les clés ne peuvent être que des string ou des nombres... une solution serait donc de convertir j en string suivant une syntaxe précise qui permettrai par la suite de ré-encoder les clés de ce dictionnaire en liste... ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in seqADN:
        for j in liste2:
            dico['-'.join(j)]=seqADN[i]
                   print seqADN[i]
    les clés du dico ressembleront à cela : '58-272'. lorsque l'on voudra utiliser les données de la ou des clé(s) elle(s)-même, il suffira de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #exemple pour reconstituer liste2
    liste2=[]
    for key in dico:
        liste2.append(key.split('-'))
     
    #la même chose de façon plus concise
    liste2=[key.split('-') for key in dico]

Discussions similaires

  1. problème premier programme avec python
    Par adolphemartins dans le forum Général Python
    Réponses: 3
    Dernier message: 04/12/2011, 12h45
  2. Lire un programme en python, sans python
    Par Guigiz dans le forum Py2exe
    Réponses: 15
    Dernier message: 09/06/2006, 21h11
  3. problème finalisation programme
    Par depelek dans le forum Installation, Déploiement et Sécurité
    Réponses: 9
    Dernier message: 02/05/2006, 16h17
  4. Problème d'encodage avec Python
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 22/02/2006, 14h36
  5. Réponses: 1
    Dernier message: 26/09/2005, 19h29

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