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 :

Python et ADN


Sujet :

Python

  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Inscrit en
    Août 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Août 2012
    Messages : 2
    Par défaut Python et ADN
    Bonjour,

    Je suis débutante. J'aimerais réaliser l'exercice ci-dessous. J'y suis presque... Mais je bloque depuis plus d'une demi heure, je ne sais pas ce qui coince. Il n'y a pas d'erreur dans le code mais je n'obtiens pas ce que je veux: il faut pour respecter l'énoncé que la paire TGCC s'affiche aussi dans la liste résultat, mais elle n'est pas retournée...

    On considere des chaines de caracteres dans l'alphabet A,C,G,T representant des sequences ADN. Une telle chaine est dite complementaire d'une autre, si on obtient la deuxieme en remplacant chaque occurrence de la lettre A par T, T par A, G par C, et C par G dans la premiere. Par exemple, les sequences ACCGAT et TGGCTA sont complementaires.
    Ecrire une fonction qui recoit en parametre une liste de telles chaines, et renvoie une nouvelle liste dans laquelle les paires complementaires sont eliminees. Pour chaque paire complementaire presente dans la liste de depart, seule la seconde cha^ne de la paire sera conservee dans la liste resultat. Par exemple, la liste suivante : ['ATCC', 'ACGG', 'TGCC', 'ACC', 'TAGG'] contient deux paires complementaires : 'ACGG' et 'TGCC' d'une part, et 'ATCC' et 'TAGG' d'autre part. On doit eliminer la premiere cha^ne (dans l'ordre de la liste) de chaque paire. La liste renvoyee par la fonction sera donc : ['TGCC', 'ACC', 'TAGG']. On supposera que toutes les cha^nes de la liste de depart sont distinctes.

    Ma solution:


    def fonction(L):
    ....T='A'
    ....A='T'
    ....G='C'
    ....C='G'
    ....for chaine in L:
    ........i=0
    ........n=0
    ........if L[n]== L[n+i]:
    ............del L[n]
    ............i=i+1
    ........elif L[n]!=L[n+i]:
    ............return L[n]

    ....return L


    print fonction(['ATCC', 'ACGG', 'TGCC', 'ACC', 'TAGG'])


    Merci d'avance!

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    Si j'ai compris, il y a une erreur dans ton résultat final ['TGCC', 'ACC', 'TAGG'], non?

  3. #3
    Nouveau candidat au Club
    Femme Profil pro
    Inscrit en
    Août 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Août 2012
    Messages : 2
    Par défaut
    Oui c'est ça, je devrais obtenir ['TGCC', 'ACC', 'TAGG'] mais je n'obtiens que ['ACC', 'TAGG'] avec mon code...

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    Ab eh bien j'ai pas compris, je pensais que le résultat final par rapport à ton énoncé devait être

    ['TGCC', 'ATCC', 'TAGG']

    J'ai pas dû piger le truc

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Le code proposé initialement ne peut pas fonctionner pour plusieurs raisons, et en particulier à cause du del L[n]: on ne doit pas modifier une liste qui est utilisée comme référence dans une boucle. Par ailleurs, je ne comprends pas le 'n' qui est initialisé à 0 mais qui n'est pas modifié dans la fonction.

    Voilà comment je ferais.

    1- j'ai fait une petite fonction séparée pour calculer le complément:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def complement(ch):
        d = 'TAGC'
        c = 'ATCG'
        return ''.join([c[d.find(car)] for car in ch])
    Ainsi, avec la liste fournie comme exemple, on a:

    ATCC => TAGG
    ACGG => TGCC
    TGCC => ACGG
    ACC => TGG
    TAGG => ATCC
    2- et voilà la fonction qui fait le traitement voulu (si j'ai bien compris!):

    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
    def fonction(L):
        # liste qui va recevoir le résultat
        R = []
        # parcours de L, sauf son dernier élément
        for i, elem in enumerate(L[:-1]):
            # calcul du complément
            comp = complement(elem)
            try:
                # est-ce que le complément de elem existe dans la suite de la liste?
                k = L.index(comp, i+1)
                # oui: on ajoute le complément au résultat
                R.append(L[k])
            except:
                # non: le complément n'est pas trouvé dans la suite
                if elem not in R:
                    # comme elem n'a pas encore été traité, on l'ajoute
                    R.append(elem)
        # traitement du dernier élément qui est:
        #   - soit un complément déjà traité,
        #   - soit un élément sans complément
        if L[-1] not in R:
            R.append(L[-1])
        # on renvoie les éléments trouvés dans R dans l'ordre où ils sont dans L
        return [elem for elem in L if elem in R]
    Exemple d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    L = ['ATCC', 'ACGG', 'TGCC', 'ACC', 'TAGG']
     
    print fonction(L)
     
    ['TGCC', 'ACC', 'TAGG']
    NB: ce code suppose qu'il n'y a pas de doublon dans la liste donnée.

    Ok?

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Une autre version:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import string
     
    complement_trans = string.maketrans('ACGT','TGCA')
    def complement(seq):
        return seq.translate(complement_trans)
     
    def fonction(L):
        LL = L[:]                      # on recopie la liste L
        for seq in L:                  # pour chaque élément de la liste d'origine
            if complement(seq) in LL:  # si son complément se trouve (encore) dans la liste résultat
                LL.remove(seq)         # on supprime l'élément
        return LL

Discussions similaires

  1. [langage] traduction d'un fonction python en perl
    Par ay_pepito dans le forum Langage
    Réponses: 3
    Dernier message: 04/12/2007, 15h06
  2. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 12h32
  3. module .so pour python... ?!
    Par totoetlititi dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 09/03/2004, 14h51
  4. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

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