Подсчет значений для строк, которые появляются последовательно - PullRequest
0 голосов
/ 20 января 2020

У меня есть строка текста с именем seq, которая имеет такие значения: AATTDYAATTDUUAATTDAATTDAATTDAAAGATAGATAYAMMMCCMMMMMMMMM

Теперь у меня также есть список значений, в котором хранятся эти строки: ['AATTD','AGAT','MMM']. Что я пытаюсь достичь с помощью своего кода, так это подсчитать, сколько раз каждое слово (не каждая буква) в списке появляется в тексте последовательно и сохранять значения счетчика строки в словаре.

Когда я говорю последовательно, это означает, что в этой части текста выше, AATTDYAATTDUUAATTDAATTDAATTD, значение для значения AATD должно быть только 3, потому что другие 2 разделены Y и UU раздельно.

Вот что я сделал с моим кодом на данный момент:

count = 0
list1 = ['AATTD','AGAT','MMM']
length = len(list1) # The length of the list 
print(length)

seq = open(filepath, "r") # open the file that has the string of text
seq = seq.read()

for i in range(len(seq)):
    for j in list1:
        while (seq[i:len(j)]  == len(j) ):
            if seq[i:len(j)]  == j:
                count += 1
    print (j, count)

Но это похоже на печать каждой строки со всеми 0 в качестве счетчиков. Может кто-нибудь помочь мне с этой проблемой? Спасибо!

Ответы [ 4 ]

2 голосов
/ 20 января 2020

Обратите внимание, что этот код неэффективен, если ваш текст содержит символы, подобные этим:

$ ^ *? \ () {} [] +

import re

seq = "AATTDYAATTDUUAATTDAATTDAATTDAAAGATAGATAYAMMMCCMMMMMMMMM"
list1 = ['AATTD','AGAT','MMM']

for word in list1:
    list2 = re.findall("(?:%s)+" % word, seq)
    longest = len(max(list2, key=len))
    print(int(longest/len(word)))

Вывод:

3
2
3

2 голосов
/ 20 января 2020

Если я правильно понимаю желаемый результат, это может быть достигнуто следующим образом:

Код:

list1 = ['AATTD','AGAT','MMM']

seq = "AATTDYAATTDUUAATTDAATTDAATTDAAAGATAGATAYAMMMCCMMMMMMMMM"

d = dict()

for s in list1:
    c = 1
    while s*c in seq:
        c += 1
    print(s, c-1)
    d[s] = c-1

Выход:

AATTD 3
AGAT 2
MMM 3
>>> d
{'AATTD': 3, 'AGAT': 2, 'MMM': 3}

Обратите внимание, что при чтении из файла вы должны использовать:

with open(filepath, "r") as f:
    seq = f.read()

, чтобы избежать проблем, когда вы забудете закрыть файл после прочтения.

2 голосов
/ 20 января 2020

используйте стандартный пакет regex в python.

import re

list1 = ['AATTD','AGAT','MMM']

seq = open(filepath, "r") # open the file that has the string of text
seq = seq.read()

for word in list1:

     # WITHOUT CASE SENSITIVE
     print(word,len(re.findall(word,seq)))

     # WITH CASE SENSITIVE SEARCH
     print(word,len(re.findall(word,seq,re.IGNORECASE)))

Документы: https://docs.python.org/3/library/re.html

2 голосов
/ 20 января 2020

В одну сторону, используя re.findall:

{t: len(re.findall("(({})+)".format(t), seq)[-1][0])/len(t) for t in list1}

Выход:

{'AATTD': 3.0, 'AGAT': 2.0, 'MMM': 3.0}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...