поиск часто встречающихся строковых паттернов с использованием Python - PullRequest
9 голосов
/ 26 ноября 2011

Итак, я пытаюсь решить эту проблему, когда мне нужно найти наиболее частую 6-буквенную строку в некоторых строках Python, поэтому я понимаю, что можно сделать что-то вроде этого:

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

Теперьданные, которые я использую - это файлы ДНК, а формат файла выглядит примерно так:

> 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 голосов
/ 27 ноября 2011

старые документы 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 голосов
/ 26 ноября 2011

Я думаю, что самый простой способ просто сделать это:

>>> 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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...