使用Python查找频繁字符串模式

9 投票
2 回答
3614 浏览
提问于 2025-04-17 07:07

我正在尝试解决一个问题,要求我在一些行中找到最常出现的6个字母的字符串,我意识到可以这样做:

>>> from collections import Counter
>>> x = Counter("ACGTGCA")
>>> x
Counter({'A': 2, 'C': 2, 'G': 2, 'T': 1})

现在,我使用的数据是DNA文件,文件的格式大致是这样的:

> name of the protein
ACGTGCA ... < more sequences> 
ACGTGCA ... < more sequences> 
ACGTGCA ... < more sequences> 
ACGTGCA ... < more sequences> 

> another protein 
AGTTTCAGGAC ... <more sequences>
AGTTTCAGGAC ... <more sequences>
AGTTTCAGGAC ... <more sequences>
AGTTTCAGGAC ... <more sequences>

我们可以先处理一个蛋白质,但接下来怎么修改上面的代码块,以便搜索最常见的6个字符的字符串模式呢?谢谢。

2 个回答

4

旧版的 itertools 文档(通过 这个回答)提供了一个叫 window 的函数,这个函数是 @Duncan 的答案的通用版本。

def window(seq, n=2):
    "Returns a sliding window (of width n) over data from the iterable"
    "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
        yield result    
    for elem in it:
        result = result[1:] + (elem,)
        yield result

然后你可以直接这样做

collections.Counter(window(x))

个人来说,我还是更喜欢用字符串切片,但如果你需要的话,这个是一个通用的版本。

4

我觉得最简单的方法就是这样做:

>>> from collections import Counter
>>> protein = "AGTTTCAGGAC"
>>> Counter(protein[i:i+6] for i in range(len(protein)-5))
Counter({'TTCAGG': 1, 'AGTTTC': 1, 'CAGGAC': 1, 'TCAGGA': 1, 'GTTTCA': 1, 'TTTCAG': 1})

撰写回答