我现在正在学习python 3。 '''它要求用户输入两个字符串并找到字符串之间的汉明距离。输入序列应仅包括核苷酸'A','T','G'和'C'。如果用户输入无效字符,程序应该要求用户重新输入序列。程序应该能够比较相同长度的字符串。如果字符串长度不同,程序应该要求用户再次输入字符串。用户应该可以输入上,下或两种情况作为输入'''
程序应按以下格式打印输出:
please enter string one: GATTACA
please enter string two: GACTATA
GATTACA
|| || |
GACTATA
The hamming distance of sequence GATTACA and GACTATA is 2
So the Hamming distance is 2.
我已在下面尝试过,但无法得到答案。
def hamming_distance(string1, string2):
string1 = input("please enter first sequence")
string2 = input("please enter second sequence")
distance = 0
L = len(string1)
for i in range(L):
if string1[i] != string2[i]:
distance += 1
return distance
答案 0 :(得分:1)
行缩进错误:L = len(strings1)
def hamming_distance(s1, s2):
return sum(ch1 != ch2 for ch1,ch2 in zip(s1,s2))
答案 1 :(得分:1)
Wiki页面具有用于计算hamming distance的精美的python和C实现。此实现假定汉明距离对于长度可变的序列无效。但是,有两种方法可以报告/计算长度不同的字符串的距离:
1)执行多个序列比对,然后计算两个空格填充字符数组之间的汉明距离...正式称为编辑距离或Levenshtein distance。
2)或者,可以使用iterttools中的zip_longest函数。以下实现等效于在较短的字符串末尾添加一串空格字符,以匹配较长的字符串的长度。 [注意:与方法1相比,此方法返回的值可能是距离的高估,因为它不考虑对齐方式。
import itertools
def hammingDist(str1, str2, fillchar = '-'):
return sum([ch1 != ch2 for (ch1,ch2) in itertools.zip_longest(str1, str2, fillvalue = fillchar)])
def main():
# Running test cases:
print('Expected value \t Value returned')
print(0,'\t', hammingDist('ABCD','ABCD'))
print(1,'\t', hammingDist('ABCD','ABED'))
print(2,'\t', hammingDist('ABCD','ABCDEF'))
print(2,'\t', hammingDist('ABCDEF','ABCD'))
print(4,'\t', hammingDist('ABCD',''))
print(4,'\t', hammingDist('','ABCD'))
print(1,'\t', hammingDist('ABCD','ABcD'))
if __name__ == "__main__":
main()
import itertools
答案 2 :(得分:0)
或者,您可以使用它。我还添加了一个引发异常的检查,因为汉明距离仅针对相等长度的序列定义,因此尝试在不同长度的序列之间进行计算是不可行的。
def distance(str1, str2):
if len(str1) != len(str2):
raise ValueError("Strand lengths are not equal!")
else:
return sum(1 for (a, b) in zip(str1, str2) if a != b)