Итак, у меня есть эта проблема, когда я получаю 2 строки букв ACGT, один с буквами, а другой - буквы и тире «-». строка с тире сравнивается с строкой без нее. ячейка для ячейки. и для каждого спаривания у меня есть система подсчета очков. Я написал этот код для системы подсчета очков: например: dna1: -ACA dna2: TACG оценка составляет -1. (поскольку тире по сравнению с буквой (T) дает -2, буква по сравнению с той же буквой дает +1 (от A до A), +1 (от C до C) и не похожие буквы дают (-1), поэтому сумма равна -1.рекурсия python с сортировкой пузыря
def get_score(dna1, dna2, match=1, mismatch=-1, gap=-2):
""""""
score = 0
for index in range(len(dna1)):
if dna1[index] is dna2[index]:
score += match
elif dna1[index] is not dna2[index]:
if "-" not in (dna1[index], dna2[index]):
score += mismatch
else:
score += gap
это работает отлично.
Теперь я должен использовать рекурсию, чтобы дать лучший результат на 2 строки. я получаю 2 строки, они могут быть разных размеров на этот раз. (я не могу измените порядок букв). поэтому я написал этот код, который добавляет «-» столько раз, сколько нужно для более короткой строки, чтобы создать 2 строки одинаковой длины и поместить их в начало списка. Теперь я хочу начать перемещение тире и записывать счет за каждую позицию позиции, а фин союзники получают наивысший балл. поэтому для перемещения тире вокруг я написал litle bubble sort .. но он dosnt, похоже, делает то, что я хочу. Я понимаю его длинный quesiton, но я бы хотел помочь. дайте мне знать, если что-то, что я написал, не понято.
def best_score(dna1, dna2, match=1, mismatch=-1, gap=-2,\
score=[], count=0):
""""""
diff = abs(len(dna1) - len(dna2))
if len(dna1) is len(dna2):
short = []
elif len(dna1) < len(dna2):
short = [base for base in iter(dna1)]
else:
short = [base for base in iter(dna2)]
for i in range(diff):
short.insert(count, "-")
for i in range(diff+count, len(short)-1):
if len(dna1) < len(dna2):
score.append((get_score(short, dna2),\
''.join(short), dna2))
else:
score.append((get_score(dna1, short),\
dna1, ''.join(short)))
short[i+1], short[i] = short[i], short[i+1]
if count is min(len(dna1), len(dna2)):
return score[score.index(max(score))]
return best_score(dna1, dna2, 1, -1, -2, score, count+1)
Чтобы уточнить, похоже, вы пытаетесь найти наилучшее место (определяемое как наивысший балл), чтобы вставить последовательность штрихов в более короткую ДНК-строку, где все тире смежны? –
черточки вставляются мной incase 1 строка короче другой. так что в основном вы правы, мне нужно найти оптимальное место для тире, чтобы получить наивысший балл. Я полагаю, что если я поместил их в начале, я мог бы переместить крайний правый штрих каждый шаг до конца с помощью сортировки пузырьков, а затем сбросить тире и переместить их на 1 ячейку вперед и повторить процесс. таким образом я записываю все возможные баллы и возвращаю наивысшее. если строки имеют одинаковый размер, мне не нужно вставлять тире. этот случай решает с первой функцией, потому что для нее есть только один возможный балл. Ничто не движется. – David
например: TCAATTAGCTT ',' TATA '- это 2 строки.Я вставляю тире вправо до той же длины, а затем перемещаю их внутри правой строки для оптимальной оценки в соответствии с правилами. Я не могу изменить порядок букв. – David