2017-06-30 3 views
0

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.

Répondre

2

La raison pour laquelle vous avez des problèmes est que vous êtes en train d'aplatir le résultat en utilisant une compréhension imbriquée dans la liste. Vous ne devriez pas avoir à se soucier du problème si vous utilisez:

[[... for _ in string] for string in sequence] 
# ^^^^ put the inner for loop here instead of at the end 

Une variante de votre deuxième solution serait:

[''.join(xlate[l] for l in s) for s in dnasequences] 
# ['CGAUCGAU', 'GAUCGAUCGAUCGAUC', 'AUCGAUCGAUCGAUCG', 'UCGAUCGAUCGAUCGA'] 

str.translate devrait être une meilleure alternative ici:

table = str.maketrans(xlate) 
[s.translate(table) for s in dnasequences] 
# ['CGAUCGAU', 'GAUCGAUCGAUCGAUC', 'AUCGAUCGAUCGAUCG', 'UCGAUCGAUCGAUCGA'] 
+0

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

+0

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

+0

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

0

Deuxième version corrigée entièrement fonctionnelle incluant une traduction un-à-plusieurs. raffiné: 7-5-2017

from pprint import pprint 

dnasequences = [ 
    'GCTAGCTA', 
    'CTAGCTAGCTAGCTAG', 
    'TAGCTAGCTAGC', 
    'AGCTAGCTAGCTAGCTAGCT', 
    'GCTA', 
    'CTAGTAGCTGACTCAGTACGTACA' 
] 

xlate = {'G': 'abc', 'C': 'G', 'T': 'A', 'A': 'U'} 

pprint([''.join(xlate[n] for n in sequence) for sequence in dnasequences]) 

Sortie: ['abcGAUabcGAU', 'GAUabcGAUabcGAUabcGAUabc', 'AUabcGAUabcGAUabcG', 'UabcGAUabcGAUabcGAUabcGAUabcGA', 'abcGAU', 'GAUabcAUabcGAabcUGAGUabcAUGabcAUGU']