找到两个DNA串之间的汉明距离

时间:2018-02-15 04:28:24

标签: python python-3.x hamming-distance

我现在正在学习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

3 个答案:

答案 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)