寻找两个DNA字符串之间的汉明距离。

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

你遇到了什么错误? - Anuraag Baishya
你已将 string1string2 作为参数传递,然后再次从用户处获取输入。这是你想要做的吗?你能澄清一下你所说的“无法得到答案”是什么意思吗? - arshovon
3个回答

4

the line indent error: L = len(strings1)

def hamming_distance(s1, s2):
    if len(s1) != len(s2):
        raise ValueError("Strand lengths are not equal!")
    return sum(ch1 != ch2 for ch1,ch2 in zip(s1,s2))

请用简单易懂的语言解释上面的return语句,谢谢。ch1和ch2是什么? - ElectronicsNewbie

3

或者,你也可以使用这个。我还添加了一个检查,因为汉明距离仅适用于等长序列,因此尝试在长度不同的序列之间计算它不应该起作用。

(注:汉明距离指的是两个等长字符串对应位置上不同字符的个数,如“abc”和“add”的汉明距离为2,因为第1个和第3个字符不同。)

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)

请用简单易懂的英语解释上面的返回语句,谢谢。那里的a和b是在做什么/代表什么? - ElectronicsNewbie
这些是来自str1和str2的字符。如果它们不同,您将获得1,然后将其全部加起来以获取str1和str2之间不同字符的数量。这就是您的汉明距离。 - baduker

2
维基页面有优雅的Python和C实现,用于计算海明距离。该实现假设海明距离对于长度不同的序列无效。然而,有两种可能的方法来报告/计算长度不同的字符串之间的距离:
1)执行多个序列对齐,然后计算两个填充了间隙的字符数组之间的海明距离...正式称为编辑距离或Levenshtein距离
2)或者,可以使用itertools中的zip_longest函数。以下实现将等效于在较短的字符串末尾添加一串间隙字符,以匹配较长字符串的长度。[注意:与第一种方法相比,此方法返回的值将高估距离,因为它不考虑对齐]
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接