2016-07-27 5 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

一つの方法itertoolsからgroupbyを使用することです:

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)を使用してiterableを消費しましたが、好きなように何でもできます(文字列を取得するには''.join(g)、カウントを取得するにはsum(1 for _ in g)など)。あなたはまた、regex.findallを使用することができ

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

あなたは正規表現を使用することができます。この場合、文字A、T、C、Gのみが存在すると仮定しました。

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