2016-07-27 75 views
0

這很簡單,我只是不能做到這一點!在這個例子中,我想要做的就是將下面的字符串拆分成彼此相鄰的相同字母塊,例如在下面的例子中:test =「AAATGG」,將被分成「AAA」,「T」,「GG」。我一直在嘗試不同的方式,下面是一個例子。我會很感激幫助。將字符串拆分成相同的字母塊

我知道這個想法是通過字符串,如果下一個字母與當前字母相同,繼續,否則,打破並打印並重新開始,我只是無法正確實施它。

test = "AAATGG" 
TestDict = {} 
for index,i in enumerate(test[:-1]): 
    string = "" 
    if test[index] == test[index+1]: 
     string = i + test[index] 
    else: 
     break 
    print string 
+0

「AAATTGGAA」如何?結果應該是什麼? – Psidom

回答

2

一種方法是使用groupbyitertools

from itertools import groupby 
[''.join(g) for _, g in groupby(test)] 
# ['AAA', 'T', 'GG'] 
1

我可能只是使用itertools.groupby

>>> import itertools as it 
>>> s = 'AAATGG' 
>>> for k, g in it.groupby(s): 
... print(k, list(g)) 
... 
('A', ['A', 'A', 'A']) 
('T', ['T']) 
('G', ['G', 'G']) 
>>> 
>>> # Multiple non-consecutive occurrences of a given value. 
>>> s = 'AAATTGGAAA' 
>>> for k, g in it.groupby(s): 
... print(k, list(g)) 
... 
('A', ['A', 'A', 'A']) 
('T', ['T', 'T']) 
('G', ['G', 'G']) 
('A', ['A', 'A', 'A']) 

正如你所看到的,g成爲能產生所有的迭代連續出現的給定字符(k)。我用list(g)來消耗迭代次數,但是你可以用它來做任何你喜歡的事情(包括''.join(g)得到一個字符串,或者sum(1 for _ in g)來得到計數)。

1

您可以使用正則表達式:

>>> re.findall(r'((\w)\2*)', test) 
[('AAA', 'A'), ('T', 'T'), ('GG', 'G')] 
1

你也可以使用regex.findall。在這種情況下,我只假定字母A,T,C和G存在。

import re 
re.findall('(A+|T+|G+|C+)', test) 
['AAA', 'T', 'GG']