带Try/Except和循环的DNA基序计数-Python3

带Try/Except和循环的DNA基序计数-Python3,python,loops,try-catch,bioinformatics,hamming-distance,Python,Loops,Try Catch,Bioinformatics,Hamming Distance,在过去的几天里,我一直在与一个特定的生物信息学问题作斗争,我想知道是否有人能在我的逻辑或代码中找到错误(或两者兼而有之)。 该函数应该查找所有与所有DNA字符串之间的汉明距离最多为d的k-mers。 这就是我想做的: 从所有可能的k-mers的迭代开始,并将它们与每个字符串进行比较 这意味着我还需要另一个穿过DNA链的循环 我为c+k做了一个while循环,逻辑的核心部分是,如果组合在所有目标字符串的任何位置都匹配,我们希望将组合收集到模式集中。我们可以使用Python的all和any函数来实现

在过去的几天里,我一直在与一个特定的生物信息学问题作斗争,我想知道是否有人能在我的逻辑或代码中找到错误(或两者兼而有之)。 该函数应该查找所有与所有DNA字符串之间的汉明距离最多为d的k-mers。 这就是我想做的:

  • 从所有可能的k-mers的迭代开始,并将它们与每个字符串进行比较

  • 这意味着我还需要另一个穿过DNA链的循环


  • 我为
    c+k做了一个while循环,逻辑的核心部分是,如果组合在所有目标字符串的任何位置都匹配,我们希望将组合收集到模式集中。我们可以使用Python的
    all
    any
    函数来实现这一点。这些函数工作效率很高,因为一旦结果确定,它们就会停止测试

    import itertools
    
    def combination(k):
        return (''.join(p) for p in itertools.product('ATCG', repeat=k))
    
    def hamming_distance(pattern, seq):
        return sum(c1 != c2 for c1, c2 in zip(pattern, seq))
    
    def window(s, k):
        for i in range(1 + len(s) - k):
            yield s[i:i+k]
    
    def motif_enumeration(k, d, DNA):
        pattern = set()
        for combo in combination(k):
            if all(any(hamming_distance(combo, pat) <= d 
                    for pat in window(string, k)) for string in DNA):
                pattern.add(combo)
        return pattern
    
    DNA = ['ATTTGGC', 'TGCCTTA', 'CGGTATC', 'GAAAATT']
    print(motif_enumeration(3, 1, DNA))
    

    我对您的代码做了一些其他更改。通过将生成器传递给
    sum
    函数,我们可以有效地计算汉明距离。我们可以通过生成器将组合元组转换为字符串,而不是将它们放入列表中,从而节省时间和内存


    motif\u枚举
    函数可以进一步压缩为一个集合理解,但我必须承认它相当密集,比以前的版本更难阅读。不过,它的效率可能会稍微高一点

    def motif_enumeration(k, d, DNA):
        return {combo for combo in combination(k)
            if all(any(hamming_distance(combo, pat) <= d 
                for pat in window(string, k)) for string in DNA)}
    

    逻辑的核心部分是,如果组合在所有目标字符串的任何位置匹配,我们希望将组合收集到模式集中。我们可以使用Python的
    all
    any
    函数来实现这一点。这些函数工作效率很高,因为一旦结果确定,它们就会停止测试

    import itertools
    
    def combination(k):
        return (''.join(p) for p in itertools.product('ATCG', repeat=k))
    
    def hamming_distance(pattern, seq):
        return sum(c1 != c2 for c1, c2 in zip(pattern, seq))
    
    def window(s, k):
        for i in range(1 + len(s) - k):
            yield s[i:i+k]
    
    def motif_enumeration(k, d, DNA):
        pattern = set()
        for combo in combination(k):
            if all(any(hamming_distance(combo, pat) <= d 
                    for pat in window(string, k)) for string in DNA):
                pattern.add(combo)
        return pattern
    
    DNA = ['ATTTGGC', 'TGCCTTA', 'CGGTATC', 'GAAAATT']
    print(motif_enumeration(3, 1, DNA))
    

    我对您的代码做了一些其他更改。通过将生成器传递给
    sum
    函数,我们可以有效地计算汉明距离。我们可以通过生成器将组合元组转换为字符串,而不是将它们放入列表中,从而节省时间和内存


    motif\u枚举
    函数可以进一步压缩为一个集合理解,但我必须承认它相当密集,比以前的版本更难阅读。不过,它的效率可能会稍微高一点

    def motif_enumeration(k, d, DNA):
        return {combo for combo in combination(k)
            if all(any(hamming_distance(combo, pat) <= d 
                for pat in window(string, k)) for string in DNA)}
    

    不管是谁在我的帖子上投了一票,如果你要这么做的话,你至少能试着帮我一下,告诉我为什么我的问题很愚蠢吗?我之所以问这个问题,是因为我花了很多时间在这个问题上,真的不知道如何修复我的代码。我刚刚加载了你的代码,意识到我不知道如何开始运行这个。你从来没有真正调用函数来启动它。“我们到底该怎么办呢?”roganjosh我刚刚编辑了我的帖子。这是最底层的问题,为什么您故意导致NameError,而不仅仅是从函数返回?此外,由于使用了
    全局模式
    ,因此跟踪代码的逻辑也有点棘手。好的,你应该在问题的主体中添加预期的结果。无论是谁在我的帖子中被点击并被点击,如果你要这样做,你至少能试着帮我一下,告诉我为什么我的问题很愚蠢吗?我之所以问这个问题,是因为我花了很多时间在这个问题上,真的不知道如何修复我的代码。我刚刚加载了你的代码,意识到我不知道如何开始运行这个。你从来没有真正调用函数来启动它。“我们到底该怎么办呢?”roganjosh我刚刚编辑了我的帖子。这是最底层的问题,为什么您故意导致NameError,而不仅仅是从函数返回?此外,由于使用了
    全局模式
    ,因此跟踪代码的逻辑有点棘手。好的,您应该将预期的输出添加到问题主体中。我现在明白了。我错过了函数中所有字符串的通用性。这是一个非常优雅的答案。要是我以前知道任何事情就好了。。。感谢you@DrJessop我的荣幸!我在回答的末尾添加了一个稍微可读的版本。在最好的时候,生成器/理解可能很难阅读,而嵌套它们会使阅读变得更加困难我现在明白了。我错过了函数中所有字符串的通用性。这是一个非常优雅的答案。要是我以前知道任何事情就好了。。。感谢you@DrJessop我的荣幸!我在回答的末尾添加了一个稍微可读的版本。在最好的时候,生成器/理解可能很难阅读,而嵌套它们会使阅读变得更加困难
    def motif_enumeration(k, d, DNA):
        return {combo for combo in combination(k)
            if all(any(hamming_distance(combo, pat) <= d 
                for pat in window(string, k)) for string in DNA)}
    
    # Return True if combo is within d in any window of string
    def in_window(combo, string, k, d):
        return any(hamming_distance(combo, pat) <= d for pat in window(string, k))
    
    def motif_enumeration(k, d, DNA):
        pattern = set()
        for combo in combination(k):
            if all(in_window(combo, string, k, d) for string in DNA):
                pattern.add(combo)
        return pattern