#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]