带Try/Except和循环的DNA基序计数-Python3
在过去的几天里,我一直在与一个特定的生物信息学问题作斗争,我想知道是否有人能在我的逻辑或代码中找到错误(或两者兼而有之)。 该函数应该查找所有与所有DNA字符串之间的汉明距离最多为d的k-mers。 这就是我想做的:带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函数来实现
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