2017-09-09 3 views
-1

ProblèmeARNm déduisant de protéines Rosalind

Pour aa positifs des nombres entiers et nn, nn aa modulo (amodnamodn écrit en abrégé) est le reste quand aa est divisé par nn. Par exemple, 29mod11 = 729mod11 = 7 parce que 29 = 11 × 2 + 729 = 11 × 2 + 7.

L'arithmétique modulaire est l'étude de l'addition, de la soustraction, de la multiplication et de la division par rapport à l'opération modulo. Nous disons que aa et bb sont congrus modulo nn si amodn = bmodnamodn = bmodn; dans ce cas, nous utilisons la notation a≡bmodna≡bmodn. Deux faits utiles dans l'arithmétique modulaire sont que si a≡bmodna≡bmodn et c≡dmodnc≡dmodn, alors a + c≡b + dmodna + c≡b + dmodn et a × c≡b × dmodna × c≡ b × dmodn. Pour vérifier votre compréhension de ces règles, vous pouvez vérifier ces relations pour a = 29a = 29, b = 73b = 73, c = 10c = 10, d = 32d = 32 et n = 11n = 11. Comme vous le verrez dans cet exercice, certains problèmes de Rosalind demanderont une (très grande) solution entière modulo un plus petit nombre pour éviter les pièges calculatoires qui se produisent avec le stockage de tels grands nombres.

Donné: Une chaîne de protéines de longueur au plus 1000 aa. Retour: Le nombre total de chaînes d'ARN différentes à partir desquelles la protéine aurait pu être traduite, modulo 1,000,000. (Ne pas négliger l'importance du codon d'arrêt dans la traduction des protéines.)

échantillon Dataset

MA

Exemple de sortie

Ma réponse est toujours à zéro. Je me rends compte qu'il y a un problème avec la façon d'utiliser mod mais je ne sais pas exactement ce que c'est.

rna_table = {"UUU":"F", "UUC":"F", "UUA":"L", "UUG":"L", 
"UCU":"S", "UCC":"s", "UCA":"S", "UCG":"S", 
"UAU":"Y", "UAC":"Y", "UAA":"STOP", "UAG":"STOP", 
"UGU":"C", "UGC":"C", "UGA":"STOP", "UGG":"W", 
"CUU":"L", "CUC":"L", "CUA":"L", "CUG":"L", 
"CCU":"P", "CCC":"P", "CCA":"P", "CCG":"P", 
"CAU":"H", "CAC":"H", "CAA":"Q", "CAG":"Q", 
"CGU":"R", "CGC":"R", "CGA":"R", "CGG":"R", 
"AUU":"I", "AUC":"I", "AUA":"I", "AUG":"M", 
"ACU":"T", "ACC":"T", "ACA":"T", "ACG":"T", 
"AAU":"N", "AAC":"N", "AAA":"K", "AAG":"K", 
"AGU":"S", "AGC":"S", "AGA":"R", "AGG":"R", 
"GUU":"V", "GUC":"V", "GUA":"V", "GUG":"V", 
"GCU":"A", "GCC":"A", "GCA":"A", "GCG":"A", 
"GAU":"D", "GAC":"D", "GAA":"E", "GAG":"E", 
"GGU":"G", "GGC":"G", "GGA":"G", "GGG":"G"} 

with open("rosalind_mrna.txt") as myfile: 

    data = myfile.readlines() 

charData = list(data[0].strip()) 


frequency_list = {}; 

for k,v in rna_table.items(): 

    if not frequency_list.has_key(v): 
    frequency_list[v] = 1 
    else: 
    frequency_list[v] += 1 

answer = frequency_list['STOP']; 
for aa in charData: 
    answer = ((answer * frequency_list[aa]) % 1000000) 

print "Answer is:\n" 
print answer % 1000000 
+0

comment peut on ne néglige pas l'importance du codon stop dans la traduction des protéines? – PRMoureu

+0

Voir le problème original à http://rosalind.info/problems/mrna/ - le formatage est un peu plus agréable. –

+0

A quoi ressemble votre fichier d'entrée? Est-il possible que vous ayez une ligne vide au début? –

Répondre

0

Quelques problèmes mineurs:

  • Vous avez une faute de frappe: "UCC":"s" devrait être "UCC":"S"
  • if not frequency_list.has_key(v): est plus Pythonically écrit que if v not in frequency_list: (en fait .has_key a été retiré de Python 3)
  • charData = list(data[0].strip()) - list() n'est pas nécessaire, vous pouvez parcourir directement sur la chaîne tout aussi bien
  • frequency_list = {}; - le point-virgule de fin n'est pas nécessaire
  • print answer % 1000000 - la % 1000000 finale est inutile, il a déjà été fait dans la boucle calcul answer

il ressemble l'exemple, MA, fonctionne comme

(
    {number of ways to encode M == 1} 
    * {number of ways to encode A == 4} 
    * {number of ways to encode STOP == 3} 
) 
% 1000000 

qui donne 12, comme indiqué. Votre code fonctionne pour moi tel quel, en renvoyant 827968.Je voudrais jeter un oeil à votre copie de rosalind_mrna.txt (assurez-vous que ce n'est pas un fichier vide) et vérifier le contenu de data (assurez-vous qu'il charge le fichier correctement).

A titre de comparaison, je l'écrire comme

from functools import reduce 
from operator import mul 

freq = { 
    'A': 4, 'C': 2, 'D': 2, 'E': 2, 
    'F': 2, 'G': 4, 'H': 2, 'I': 3, 
    'K': 2, 'L': 6, 'M': 1, 'N': 2, 
    'P': 4, 'Q': 2, 'R': 6, 'S': 6, 
    'T': 4, 'V': 4, 'W': 1, 'Y': 2, 
    'STOP': 3 
} 

def load_dna_file(fname): 
    with open(fname) as inf: 
     dna = inf.read() 
    return "".join(dna.split()) # removes all whitespace 

def num_rna_strings(dna, modulo=None): 
    if modulo: 
     reduce_fn = lambda a, b: (a * b) % modulo 
    else: 
     reduce_fn = mul 
    freqs = (freq[base] for base in dna) 
    return reduce(reduce_fn, freqs, freq["STOP"]) 

def main(): 
    dna = load_dna_file("rosalind_mrna.txt") 
    num = num_rna_strings(dna, 1000000) 
    print("Answer is {}".format(num)) 

if __name__ == "__main__": 
    main() 

Pour l'intérêt, si vous ne l'utilisez modulo, la réponse complète est de 423 chiffres (6,186 * 10 ** 422)