将字符串分割成相同字母的块

7

这很简单,只是我做不到!在这个例子中,我想要的是把下面的字符串分成相同字母的块,例如在下面的例子中: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

“AAATTGGAA”应该返回什么结果? - Psidom
4个回答

10

一种方法是使用 itertools 中的 groupby

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

3

我可能会使用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) 来获取计数)。


2
您可以使用正则表达式:
>>> re.findall(r'((\w)\2*)', test)
[('AAA', 'A'), ('T', 'T'), ('GG', 'G')]

2
你也可以使用regex.findall。在这种情况下,我假设只有字母A、T、C和G存在。
import re
re.findall('(A+|T+|G+|C+)', test)
['AAA', 'T', 'GG']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接