2017-10-16 5 views
2

Ceci est le code que j'ai pour atteindre mon objectif comme indiqué dans le titre. Le problème que je semble avoir maintenant est la deuxième ligne de code. Au moment où je l'ai ajouté, le programme a cessé de fonctionner sans me donner d'erreur. Merci d'avance pour l'aide.transcription de l'adn supérieure avec pour boucle

seqDNA = input() 
seqDNA = seqDNA.upper() 
comp = '' 
for c in seqDNA: 
    if c == 'a': 
     comp = comp + 'u' 
    elif c == 't': 
     comp = comp + 'a' 
    elif c == 'g': 
     comp = comp + 'c' 
    elif c == 'c': 
     comp = comp + 'g' 
print(comp) 
+0

Que voulez-vous dire avec * deuxième ligne *? 'seqDNA = seqDNA.upper()'? –

Répondre

0

Ce comportement est correct puisque vous vérifiez les caractères majuscules contre les minuscules. Après seqDNA = seqDNA.upper(), votre chaîne contient majuscule caractères. Par exemple:

seqDNA = 'UGCGGCGAATATTT' 

Si nous itérez avec for c in seqDNA, c contiendra un caractère majuscule (à savoir 'C'). Maintenant, si vous comparez c == 'C', vous comparez 'c' == 'C', et ceux-ci sont pas égale.

Vous devez modifier les tests pour:

seqDNA = input() 
seqDNA = seqDNA.upper() 
comp = '' 
for c in seqDNA: 
    if c == 'A': 
     comp = comp + 'u' 
    elif c == 'T': 
     comp = comp + 'a' 
    elif c == 'G': 
     comp = comp + 'c' 
    elif c == 'C': 
     comp = comp + 'g' 
print(comp)

Cela dit, votre code fonctionne inefficace: tout d'abord la séquence de déclarations elif est cher, et de plus vous effectuez une opération comp = comp + 'u'. L'ajout de chaîne s'exécute en O (n), rendant cet algorithme O().

Nous pouvons l'améliorer par en utilisant un dictionnaire, et ** utiliser ''.join(..) en ajoutant manuellement.

seqDNA = input() 
seqDNA = seqDNA.upper() 
trans = { 'A': 'u', 'T': 'a', 'G': 'c', 'C': 'g' } comp = ''.join(trans[c] for c in seqDNA) 
print(comp)

Cela soulèvera un KeyError au cas où le seqDNA contient un caractère autre que 'A', 'T', 'G' et 'C'. Ce qui me semble être un comportement raisonnable. Si vous voulez simplement ne pas tenir compte ces caractères, vous pouvez utiliser .get(..,'') sur [c]:

seqDNA = input() 
seqDNA = seqDNA.upper() 
trans = { 
    'A': 'u', 
    'T': 'a', 
    'G': 'c', 
    'C': 'g' 
} 
comp = ''.join(trans.get(c,'') for c in seqDNA) 
print(comp)
+1

Je comprends et je vous remercie pour l'optimisation du code, mais je ne suis pas encore à l'aise avec les dictionnaires. Ce que j'aurais dû faire était, et je ne sais pas je ne m'en souviens pas, était simplement supérieur à la fin: comp = comp.upper() – forsale