【问题标题】:find the Hamming distance between two DNA strings找到两个 DNA 字符串之间的汉明距离
【发布时间】:2018-02-15 04:28:24
【问题描述】:

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

【问题讨论】:

  • 您遇到的错误是什么?
  • 您已将 string1string2 作为参数传递,然后再次从用户那里获取输入。是你打算做的吗?你能澄清一下“无法得到答案”的意思吗?

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


【解决方案1】:

行缩进错误: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 是什么?
【解决方案2】:

或者,您可以使用它。我还添加了一个引发异常的检查,因为汉明距离仅针对相等长度的序列定义,因此尝试在不同长度的序列之间进行计算是行不通的。

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)

【讨论】:

  • 请用通俗易懂的英文解释,上面的return语句,谢谢。 a 和 b 在那里做什么/它们代表什么?
  • 这些是来自 str1 和 str2 的字符。如果它们不同,则得到 1,然后将它们相加得到 str1 和 str2 之间不同字符的数量。这是你的汉明距离。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2013-04-22
    相关资源
    最近更新 更多