2017-06-30 76 views
0

下面的代碼工作完全一樣意圖:範圍()具有可變步整數值

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)]) 

它返回: [ 'CGAUCGAUCGAUCGAU', 'GAUCGAUCGAUCGAUC', 'AUCGAUCGAUCGAUCG', 'UCGAUCGAUCGAUCGA']

我正在修改它,以便dnasequences()中的DNA序列可以具有任何可變長度。

我靠近這個:

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) 

它打印前兩個翻譯的正確序列,但開始與第三它是關閉(雖然我有第二個問題:在第二個程序版本我得到一個單獨的列表中dnasequences每個序列(),其中 我不想要的。我想和像在第一個版本四個元素的單個列表。)

在第一迭代i = 0 在第二迭代i = 8。到目前爲止這麼好。

但在第三次迭代(在PyCharm調試器)我看到,我= 16 我相信它應該是24.既然不是,第三和第四翻譯 是錯誤的,它的錯誤了與'索引超出範圍'錯誤。

如果第三次迭代是i = 24,第四次i = 40,它就會起作用。

我只是不明白爲什麼它得到的前兩個迭代正確,然後開始失敗的第三。

在第一個程序'我'步驟通過0,16,32和48就好了。

回答

2

您陷入困境的原因是您在列表理解中使用嵌套對齊結果。你不應該擔心的問題,如果你使用:

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

你的第二個解決方案的一個變化是:

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

str.translate這裏應該是一個更好的選擇:

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

不幸的是,我無法理解你的解決方案(我仍然很新的這一點)。你做了什麼修改第二個程序?謝謝。 – MarkS

+0

修改是將'for n in sequence'移動到列表理解的開頭,這樣就不會使結果變平。 – Psidom

+0

今天早上再次用一雙新的眼睛看着它。現在,我將對您的第二個解決方案進行修改。此外,maketrans()的文檔說明翻譯必須具有相同的長度:「注意:intab和outtab都必須具有相同的長度。」通過我的第二個解決方案,您可以進行一對多翻譯。謝謝! – MarkS

0

功能齊全的第二版修正版,包含一對多翻譯。 精製:2017年7月5日

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]) 

輸出: ['abcGAUabcGAU', 'GAUabcGAUabcGAUabcGAUabc', 'AUabcGAUabcGAUabcG', 'UabcGAUabcGAUabcGAUabcGAUabcGA', 'abcGAU', 'GAUabcAUabcGAabcUGAGUabcAUGabcAUGU']