【发布时间】:2013-12-02 04:39:07
【问题描述】:
所以,我有这个问题,我收到 2 串字母 ACGT,一个只有字母,另一个包含字母和破折号“-”。两者的长度相同。带有破折号的字符串与没有破折号的字符串进行比较。一个细胞一个细胞。对于每对配对,我都有一个评分系统。我为评分系统编写了这段代码: 例如: dna1:-ACA dna2:TACG 得分为-1。 (因为破折号与字母(T)相比给出-2,字母与相同字母相比给出+1(A到A),+1(C到C)和不相似的字母给出(-1)所以总和是-1。
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 个相同长度的字符串并将它们放在列表的开头。现在我想开始移动破折号并记录每个破折号位置的分数,最后获得最高的可能分数。所以为了移动破折号,我写了一个小气泡排序..但它似乎没有做我想要的。我意识到这是一个很长的问题,但我希望得到一些帮助。如果我写的任何内容不明白,请告诉我。
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)
【问题讨论】:
-
澄清一下,您似乎正在尝试找到可能的最佳位置(定义为最高分)将短划线序列插入较短的 DNA 字符串中,其中所有短划线都相邻?
-
破折号由我插入,以防 1 个字符串比另一个短。所以基本上你是对的,我需要找到破折号的最佳位置以获得最高分。我想如果我把它们放在开头,我可以通过冒泡排序移动每一步最右边的破折号直到结束,然后重置破折号并将它们向前移动 1 个单元格并重复该过程。这样我就记录了所有可能的分数并返回最高的分数。如果字符串大小相同,我不必插入破折号。这种情况可以用第一个函数解决,因为它只有 1 个可能的分数。没有任何动作。
-
例如:TCAATTAGCTT', 'TATA' 是两个字符串。我将破折号向右插入,直到其长度相同,然后根据规则在正确的字符串内移动它们以获得最佳分数。我不能改变字母的顺序。
-
你能用破折号分割你的小字符串吗?即
T-A-T-A---- -
是的,只要总长度等于另一个字符串并且我不改变字母顺序。我可以用破折号做任何我想做的事情来产生最高分
标签: python recursion bubble-sort