2016-12-06 31 views
1

我正在分析一個RNA序列,我需要密碼子。我首先需要我的核苷酸字符串分隔成三對的列表,但我必須給我的功能,要麼始於指數1,2讀取字符串reading_frame參數,或3如何從索引0,1或2開始每隔三個索引分割一個字符串?

我做了這個代碼和不知道爲什麼它不起作用,每當我爲任何索引執行操作時,都會得到一個不完整的列表。

sequence = self.sequence.upper() 
split_sequence = [] 
while len(sequence) >= 3: 
    split_sequence.append(sequence[reading_frame:reading_frame + 3]) 
    reading_frame = reading_frame + 3 
    sequence = sequence[reading_frame:] 
return split_sequence 

我也試着使用條件和正則表達式,但無法弄清楚我會怎麼做索引(reading_frame)正則表達式1和2

if reading_frame == 0: 
    split_sequence = re.findall(r'...', sequence) 

if reading_frame == 1: 
    split_sequence = re.findall(r'', sequence) 

if reading_frame == 2: 
    split_sequence = re.findall(r'', sequence) 

就如何解決這些任何想法方法,還是有更簡單的方法來做到這一點? 謝謝!

+2

你可以舉一個輸入字符串的例子,你想如何分裂? – user3030010

+0

[分割python字符串每隔n個字符?]的可能的重複(http://stackoverflow.com/questions/9475241/split-python-string-every-nth-character) – coder

回答

0
sequence = sequence[reading_frame:] 
split_sequence = [sequence[i:i+3] for i in range(0, len(sequence), 3)] 
0

遺憾沒能解決您的代碼,但你也可以使用一個列表理解像this answer ...

sequence = "ABCBACCABBAC" 
n = 3 
starting_point = 2 
[sequence[i:i+n] for i in range(starting_point, len(sequence), n)] 
>>> ['CBA', 'CCA', 'BBA', 'C'] 

starting_point = 0 
[sequence[i:i+n] for i in range(starting_point, len(sequence), n)] 
>>> ['ABC', 'BAC', 'CAB', 'BAC'] 
0

你想要做的是讀取數據塊的迭代,如所描述here。如果您使用Python 2,請使用以下實用程序功能:

def chunks(l, n): 
    """Yield successive n-sized chunks from l.""" 
    for i in xrange(0, len(l), n): 
     yield l[i:i + n] 

此函數返回一個生成器而不是一個列表。使用這樣的:

s = 'ATCATGATTTATAGGHCFFDD' 
codons = list(chunks(s, 3)) # ['ATC', 'ATG', 'ATT', 'TAT', 'AGG', 'HCF', 'FDD'] 
1

這是一個帶幀參數的發電機:

def codons(seq,frame): 
    n = len(seq) 
    for i in range(frame - 1, n - 2, 3): 
     yield seq[i:i+3] 

例如:

test = 'ACTGCAGCATCAGCCATGCAACT' 

for i in range(1,4): 
    print(list(codons(test,i))) 

輸出:

['ACT', 'GCA', 'GCA', 'TCA', 'GCC', 'ATG', 'CAA'] 
['CTG', 'CAG', 'CAT', 'CAG', 'CCA', 'TGC', 'AAC'] 
['TGC', 'AGC', 'ATC', 'AGC', 'CAT', 'GCA', 'ACT'] 

作爲發電機,你可以按照如下方式循環密碼子:

>>> for codon in codons(test,1): print(codon) 

ACT 
GCA 
GCA 
TCA 
GCC 
ATG 
CAA 

請注意,發生器總是產生長度爲3的整個密碼子。如果給定的讀碼框以長度爲1或2的片段結尾,則不會由發生器返回。這種行爲是有目的的,儘管它很容易被修改以返回最終的片段,如果這是你想要的。

相關問題