2013-08-29 1 views
0

J'écris un programme qui lit un certain nombre de caractères d'ADN (qui est toujours divisible par 3) et vérifie s'ils correspondent au même acide aminé. Par exemple AAT et AAC correspondent tous les deux à N donc mon programme devrait imprimer "C'est pareil". C'est très bien mais je ne sais pas comment comparer 6/9/12/un multiple de 3 et voir si les définitions sont les mêmes. Par exemple:Comparer des chaînes à un dictionnaire par groupes de multiples de 3

AAAAACAAG 
AAAAACAAA 

Devrait me renvoyer C'est pareil qu'ils sont tous les deux KNK.

Voici mon code:

sequence = {} 
d = 0 
for line in open('codon_amino.txt'): 
    pattern, character = line.split() 
    sequence[pattern] = character 
a = input('Enter original DNA: ') 
b = input('Enter patient DNA: ') 
for i in range(len(a)): 
    if sequence[a] == sequence[b]: 
    d = d + 0 
    else: 
    d = d + 1 
if d == 0: 
    print('It\'s the same') 
else: 
    print('Mutated!') 

Et la structure de mon codon_amino.txt est structuré comme:

AAA K 
AAC N 
AAG K 
AAT N 
ACA T 
ACC T 
ACG T 
ACT T 

Comment puis-je comparer les structures d'ADN dans bagouts de 3? Je l'ai pour des cordes qui ont 3 lettres de long mais ça renvoie une erreur pour quoi que ce soit de plus.

EDIT:

Si je savais comment diviser a et b dans une liste qui était à des intervalles de trois qui pourraient aider ainsi comme:

a2 = a.split(SPLITINTOINTERVALSOFTHREE) 

alors je pourrais facilement utiliser une boucle à itérer à travers eux, mais comment puis-je les séparer en premier lieu?

EDIT: LA SOLUTION:

sequence = {} 
d = 0 
for line in open('codon_amino.txt'): 
    pattern, character = line.split() 
    sequence[pattern] = character 
a = input('Enter original DNA: ') 
b = input('Enter patient DNA: ') 
for i in range(len(a)): 
    if all(sequence[a[i:i+3]] == sequence[b[i:i+3]] for i in range(0, len(a), 3)): 
    d = d + 1 
    else: 
    d = d + 0 
if d == 0: 
    print('The patient\'s amino acid sequence is mutated.') 
else: 
    print('The patient\'s amino acid sequence is not mutated.') 
+0

Essayez-vous de diviser "AAAAACAAG" en ['AAA', 'AAC', 'AAG']? – badc0re

+0

Votre solution éditée n'a pas beaucoup de sens pour autant que je sache. Veuillez regarder à nouveau la solution acceptée. – Josay

Répondre

0

Je pense que vous pouvez remplacer votre deuxième boucle et des comparaisons avec:

if all(sequence[a[i:i+3]] == sequence[b[i:i+3]] for i in range(0, len(a), 3)): 
    print('It\'s the same') 
else: 
    print('Mutated!') 

itérées fonction all sur l'expression du générateur, et la volonté soit False si l'une des valeurs est False. L'expression du générateur compare la longueur de trois tranches des chaînes.

+0

Fermer! La solution est de garder ma boucle ci-dessus en ajoutant D = D + 1 ETC mais mettre si tout (séquence [a [i: i + 3]] == séquence [b [i: i + 3]] pour i dans la plage (0, len (a), 3)): au lieu de sequence [a] == sequence [b] – NoviceProgrammer

+0

Utilisez-vous les valeurs 'd' plus tard? Sinon, vous ne devriez pas avoir besoin de la boucle explicite ('all' s'arrête après la première valeur false). Si vous aviez besoin d'un décompte des discordances, vous pourriez faire 'd = sum (sequence [a [i: i + 3]]!= séquence [b [i: i + 3]] pour i dans la plage (0, len (a), 3)) ', qui fonctionne parce que' True' est égal à 1 et 'False' est égal à 0. – Blckknght

0

Je pense que ce que vous devez faire est:

  • écrire une fonction pour diviser une chaîne en morceaux un 3 caractères. (Some hints here)
  • écrire une fonction pour convertir une chaîne en cela correspondant séquence d'acides aminés (en utilisant la fonction précédente)
  • comparer les séquences.
0

Si c'est ce que vous entendez:

def DNA(string): 
    return [string[i:i+3] for i in xrange(0,len(string),3)] 

amino_1 = DNA("AAAAACAAG") 
amino_2 = DNA("AAAAACAAA") 

print amino_1, amino_2 
print amino_1 == amino_2 

Output: ['AAA', 'AAC', 'AAG'] ['AAA', 'AAC', 'AAA'] 
False 
Questions connexes