Compréhension et correction

diom78911 -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je suis un étudiant et je début en python et j aimerait avoir votre aide

Écrire une fonction
est_adn
qui reçoit une chaîne de caractères en paramètre et qui retourne
True
si cette chaîne de caractères n'est pas vide et peut représenter un brin d’ADN,
False
sinon

Voici mon code

def est_adn(s):
    if s not in "ACGT": 
        return False
    elif s == "":
        return False
    else:
        return True


ok L'entête de la fonction est_adn est correctement défini
ok Bon résultat pour est_adn('tT') : False
fail Résultat attendu pour est_adn('ATGTATTGCGT') : True
ok Bon résultat pour est_adn('gTxatgAGggytG') : False
ok Bon résultat pour est_adn('czazxygccgaTACxG') : False
ok Bon résultat pour est_adn('') : False
ok Bon résultat pour est_adn('CgGCCt') : False
ok Bon résultat pour est_adn('yxgtzzCayyytAA') : False
fail Résultat attendu pour est_adn('TGTG') : True
fail Résultat attendu pour est_adn('TGGTTC') : True
fail Résultat attendu pour est_adn('AGGAA') : True


Les ligne fail ne passent. Puis-je avoir une correction de mon code ou pouvez-vous m'indiquer je me suis trompé ?

3 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Bonjour,

    Ton code teste si la sous-chaîne "ACTG" apparaît dans le brin d'ADN, alors que je suppose que le test que tu souhaites effectuer, c'est si chacun des caractères si le brin d'ADN n'implique que les caractères A, C, T, G.

    Quatre manières de résoudre ton problème :
    • soit tu itères sur chaque caractère et tu vérifie si le caractère courant apparaît dans "ACTG" (ou mieux, dans l'ensemble
      {A, C, T, G}
      )

    def est_adn(s):
        if not s:
            return False
        for a in s:
            if a not in {'A', 'C', 'T', 'G'}:
                return False
        return True
    • ce qui peut se réécrire
      all
      :

    def est_adn(s):
        return s and all(
            a in {'A', 'C', 'T', 'G'}
            for a in s
        )
    • soit tu convertis la chaîne qui contient le brin d'ADN en ensemble (
      set(s)
      ) et tu vérifies si cet ensemble est inclu ou égal à l'ensemble
      {A, C, T, G}
      .

    def est_adn(s):
        return s and set(s) <= {'A', 'C', 'T', 'G'}
    • soit tu utilises une expression rationnelle (c'est plus général, mais vu la simplicité du test, mais c'est l'occasion d'ajouter cette corde à ton arc pour des tests plus évolués que tu seras amené(e) à faire à l'avenir).

    import re
    
    RE_ADN = re.compile(r"[ACTG]+")
    
    def est_adn(s):
        return bool(RE_ADN.match(s))


    Bonne chance
    0
  2. diom78
     
    Merci beaucoup mamiemando pour cette explication. Comme je suis un étudiant débutant, j'aimerais beaucoup échanger avec vous c'est possible et apprendre auprès de vous en suivant vos conseils.
    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
       
      Bonjour, de rien ! Niveau échange, c'est très simple, il suffit d'ouvrir sur le forum une nouvelle discussion pour chaque nouveau problème que tu rencontres ;-) Mais je ne donne pas de cours car malheureusement j'ai peu de temps libre.
      0