Le code suivant fonctionne exactement comme prévu:range() avec une valeur de nombre entier de pas variable
dnasequences = [
'GCTAGCTAGCTAGCTA',
'CTAGCTAGCTAGCTAG',
'TAGCTAGCTAGCTAGC',
'AGCTAGCTAGCTAGCT'
]
xlate = {'G': 'C', 'C': 'G', 'T': 'A', 'A': 'U'}
def dna2rna(sequences):
rnalist = [xlate[n] for sequence in sequences for n in sequence]
return rnalist
rnasequences = dna2rna(dnasequences)
print([''.join(rnasequences[i:i+16]) for i in range(0, len(rnasequences), 16)])
Elle retourne: [ 'CGAUCGAUCGAUCGAU', 'GAUCGAUCGAUCGAUC', 'AUCGAUCGAUCGAUCG', 'UCGAUCGAUCGAUCGA']
J'essaie de le modifier afin que les séquences d'ADN dans dnasequences() puissent être de longueur variable.
Je suis étroite avec ceci:
dnasequences = [
'GCTAGCTA',
'CTAGCTAGCTAGCTAG',
'TAGCTAGCTAGCTAGC',
'AGCTAGCTAGCTAGCT'
]
xlate = {'G': 'C', 'C': 'G', 'T': 'A', 'A': 'U'}
def dna2rna(sequences):
rnalist = [xlate[n] for sequence in sequences for n in sequence]
seqlen = [len(sequence) for sequence in sequences]
return rnalist, seqlen
def printxlate(rnasq, lens):
index = 0
for i in range(0, len(rnasq), lens[index]):
print([''.join(rnasq[i:i+lens[index]])])
index += 1
rnasequences, seqlens = dna2rna(dnasequences)
printxlate(rnasequences, seqlens)
Il imprime les deux premières correctement des séquences traduites, mais en commençant par le troisième, il est hors (bien que j'ai une deuxième question: dans la deuxième version du programme que je suis obtenir une liste séparée pour chaque séquence séquences d'ADN(), que je ne veux pas. Je veux une liste unique avec quatre éléments comme dans la première version.)
sur la première itération i = 0. au deuxième itération i = 8. Jusqu'ici tout va bien.
Mais la troisième itération (dans le débogueur de PyCharm) Je vois que i = 16. Je crois qu'il devrait être 24. Comme il est pas, les troisième et quatrième traductions sont fausses et il les erreurs dues à un Erreur "index hors plage".
Si la troisième itération était i = 24 et la quatrième i = 40 cela fonctionnerait. Je ne vois tout simplement pas pourquoi les deux premières itérations sont corrigées et commencent à échouer sur la troisième.
Dans le premier programme 'i' passe par 0, 16, 32 et 48 très bien.
Malheureusement, j'ai du mal à comprendre votre solution (je suis encore assez nouveau à ce sujet). Quelle modification avez-vous apportée au deuxième programme? Merci. – MarkS
La modification est de déplacer le 'pour n en séquence' au début de la compréhension de la liste, de sorte que vous n'atteignez pas le résultat. – Psidom
Regardé à nouveau ce matin avec une nouvelle paire d'yeux. Maintenant, je reçois votre modification à ma deuxième solution. En outre, la documentation de maketrans() indique que les traductions doivent avoir la même longueur: "Note: intab et outtab doivent avoir la même longueur." Avec ma deuxième solution, vous pouvez avoir des traductions un-à-plusieurs. Merci! – MarkS