Je viens de commencer à apprendre Python et j'ai une question. Étant donné une entrée utilisateur d'une séquence d'ADN pouvant comporter n'importe quel nombre de caractères, comment pourrais-je procéder pour imprimer un résultat qui supprime les caractères en excès à la fin de la chaîne et renvoie un résultat?

Exemple: l'utilisateur entre une séquence d'ADN de "ACG CTA TCG C". Le résultat souhaité serait "ACG CTA TCG" (groupes de 3, excès éliminé du résultat). Si l'entrée utilisateur était "ACC TAG TAG AT", le résultat serait "ACC TAG TAG". Et ainsi de suite avec toute entrée saisie par l'utilisateur.

Voici ce que j'ai jusqu'à présent:

# Request user input, convert to uppercase and remove white spaces
dna_input = input("Enter a DNA sequence: ").upper()
dna_input = dna_input.replace(" ", "")

# Empty variable to hold reading frame result
reading_1 = ""
chars = 0

# Check that input is valid - only contain letters A, C, G, T
if set(dna_input) <= {"A", "C", "T", "G"}:
    
    # First reading frame
    # Return codons in order, trim excess
    
    chars = len(dna_input) # how many characters
    
    if chars % 3 == 0: # check if chars are divisible by three
        for j in dna_input:
            reading_1 += j
    print("First reading frame:", reading_1)
    
    else:
        print("Need to do something different. How to trim excess?")

# If invalid letters used, return error   
else:
    print("Try again using a valid input.")

J'obtiens également une erreur de syntaxe avec l'instruction else interne et je ne sais pas pourquoi ...

0
happymappy 24 sept. 2020 à 00:51

2 réponses

Meilleure réponse

J'utiliserais simplement une expression régulière pour cela

[ACTG]{3} correspondra à toute séquence de longueur 3 en utilisant les caractères {A, C, T, G} puis " ".join() les joindra avec un espace entre les deux.

def trim_chain(chain):
    print(" ".join(re.findall(r"[ACTG]{3}",chain)))
    
trim_chain("ABC ACT CTG TGG TC")
2
Evan Wunder 23 sept. 2020 à 22:16

Le problème est ici print("First reading frame:", reading_1), ce print doit être indenté. Cela brise la logique if/else.

# Request user input, convert to uppercase and remove white spaces
dna_input = input("Enter a DNA sequence: ").upper()
dna_input = dna_input.replace(" ", "")

# Empty variable to hold reading frame result
reading_1 = ""
chars = 0

# Check that input is valid - only contain letters A, C, G, T
if set(dna_input) <= {"A", "C", "T", "G"}:
    
    # First reading frame
    # Return codons in order, trim excess
    
    for i in range(len(dna_input)): # count characters
        chars += 1
    print("There are", chars, "characters.")
    
    if chars % 3 == 0: # check if chars are divisible by three
        for j in dna_input:
            reading_1 += j
        print("First reading frame:", reading_1)
    
    else:
        print("Need to do something different. How to trim excess?")

# If invalid letters used, return error   
else:
    print("Try again using a valid input.")

J'espère avoir aidé!

1
Lleims 23 sept. 2020 à 22:09