Подсчет количества CGG в микросателлитах

#python

#python

Вопрос:

У меня есть эта задача, чтобы найти количество повторений CGG в последовательности, которая хранится как значение в словаре (с именем «dict» ниже в качестве примера). Количество повторений в строке должно быть 5 или выше. Для примера: CGGCGGCGGCGGCGG и выше. Давайте назовем это повторением: «тандем». Как только я найду такой тандем, мне нужно будет подсчитать, сколько «CGG» имеется для конкретного тандема. Вот словарь для этого примера.

 dict={ind_1:"ACGGCGAGCGCGGGCGGCGGCGGTGACGGAGGCGCCCGTGCCAGGGGGCGTGCGGCAGCG**CGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGG**GCCTCGAGCGCCCGCAGCCCACCTCTCGGGGGCGGGCTCCCGGCGCTAGCAGGGCTGAAGAGAAGATGGAGGAGCTGGTGGTGGAAGTGCGGGGCTCCAATGGCGCTTTCTACAAGGTACTTGGCTCTAGGGCAGGCCCCATCTTCGCCCT", 
ind_10:"ACGGCGAGCGCGGGCGGCGGCGGTGACGGAGGCGCCCGTGCCAGGGGGCGTGCGGCAGCGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGGCGAGCGCCCGCAGCCCACCTCTCGGGGGCGGGCTCCCGGCGCTAGCAGGGCTGAAGAGAAGATGGAGGAGCTGGTGGTGGAAGTGCGGGGCTCCAATGGCGCTTTCTACAAGGTACTTGGCTCTAGGGCAGGCCCCATCTTCGCCCT"}
  

Например, в значении первого ключа (ind_1) есть только 1 тандем (выделен жирным шрифтом), потому что он состоит из 1 повторяющегося CGG, который равен 5 или выше. В этом тандеме должно быть 47 «CGG» в этом тандеме.
Это означает, что как только я найду тандем, в котором 5 повторяющихся CGG подряд, мне нужно подсчитать количество CGG в этом конкретном тандеме
Я попробовал этот код:

 dict_results = {}
for key,value in dict.items():
   tandem = 0
if value.count("CGGCGGCGGCGGCGGCGG"): 
    tandem = value.count("CGG")
dict_results[key] = tandem
  

Но для первого значения (ind_1) он сказал, что у меня 58 повторений.
Он подсчитал все CGG в последовательности, а не onces в этом конкретном тандеме (их 47).

Моя цель — иметь 47 повторений после завершения итерации.

Я также пробовал с пороговым значением:

 fragile_x_test_results = {}
for key,value in fragile_x_test.items():
    tandem = 0
    if value.count("CGG") > 5: 
        tandem = value.count("CGG")
    fragile_x_test_results[key] = tandem
  

Но все еще безуспешно. Я получил 58 вместо 47 повторений CGG

Ответ №1:

Это можно сделать, проверив наличие n * «CGG» в строке с помощью .index() и уменьшив значение n (int). Например, в строке длиной 20 вы проверяете, присутствует ли 6 * «CGG» : если да, вы помните это и создаете подстроку без этого 6 * «CGG», а затем пробуете это с 5 * «CGG» и т.д…

Приведенная ниже функция работает по этой логике и способна определять, есть ли у вас более одного тандема одинаковой длины в строке:

 def tandem_search(pattern,string):
    st=string
    result=[]
    for i in range(len(dic['ind_1'])//3 1,5,-1):
        while True:
            try:
                j=st.index(i*pattern)
                result.append(i)
                st=st[:j] st[j i*3:]
            except:
                break
    return(result)
  

С его помощью я получаю следующие результаты:

 tandem_search("CGG",dic['ind_1']) = [47]
tandem_search("CGG",dic['ind_10']) = [70]