Compréhension et correction

Fermé
diom78911 - Modifié le 12 avril 2022 à 15:30
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 - 6 mai 2022 à 13:21
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

Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 mai 2024 913
11 avril 2022 à 19:28
Bonjour
En Python, l’indentation est primordiale, or par défaut le site ne la conserve pas.
Pour la conserver il faut utiliser les balises de code. Voir ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
On pourra commencer à essayer de t’aider quand tu auras reposté correctement ton code.
0
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 7 756
Modifié le 12 avril 2022 à 15:46
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
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
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 7 756
6 mai 2022 à 13:21
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