2016-07-27 42 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']