我正在尝试解决在字符串中找到不匹配的最常见的k-mers。要求如下:
频繁出现不匹配的问题:找出字符串中不匹配的最常见的k-mers。
输入:字符串文本以及整数k和d。 (您可以假设k≤12且d≤3。)
输出:所有最常见的k-mers,文本中最多d个不匹配。
以下是一个例子:
示例输入:
ACGTTGCATGTCGCATGATGCATGAGAGCT
4 1
示例输出:
GATG ATGC ATGT
最简单,最低效的方法是列出文本中的所有k-mers并计算彼此之间的hamming_difference,并选出hamming_difference小于或等于d的模式,下面是我的代码:
kmer = 4
in_genome = "ACGTTGCATGTCGCATGATGCATGAGAGCT";
in_mistake = 1;
out_result = [];
mismatch_list = []
def hamming_distance(s1, s2):
# Return the Hamming distance between equal-length sequences
if len(s1) != len(s2):
raise ValueError("Undefined for sequences of unequal length")
else:
return sum(ch1 != ch2 for ch1, ch2 in zip(s1, s2))
for i in xrange(len(in_genome)-kmer + 1):
v = in_genome[i:i + kmer]
out_result.append(v)
for i in xrange(len(out_result)):
for j in xrange(i + 1, len(out_result)):
if hamming_distance((out_result[i], out_result[j]) <= in_mistake:
mismatch_list.append(out_result[i], out_result[j])
print mismatch_list
当我运行代码时,它总是显示&#34;语法无效&#34;并指出错误来自&#34;:&#34; &#34;如果是hamming_distance((out_result [i],out_result [j])&lt; = in_mistake:&#34;。即使我弄清楚这个也可能有更多的错误。有谁知道发生了什么?
另一件事是我知道肯定存在更好的算法。有线索吗?
答案 0 :(得分:2)
我不确定你用 mismatch_list 做了什么:你不能一次追加两件事。您是否需要扩展来添加它们?引用的额外左括号很容易修复;这个需要更多的语义工作。用
替换这些行if hamming_distance(out_result[i], out_result[j]) <= in_mistake:
mismatch_list.extend([out_result[i], out_result[j]])
给出此输出(不匹配列表):
['ACGT', 'ATGT', 'GTTG', 'GTCG', 'GTTG', 'GATG', 'TTGC', 'TCGC', 'TTGC', 'ATGC', 'TGCA', 'CGCA', 'TGCA', 'TGCA', 'GCAT', 'GCAT', 'GCAT', 'GCAT', 'CATG', 'CATG', 'CATG', 'GATG', 'CATG', 'CATG', 'ATGT', 'ATGA', 'ATGT', 'ATGC', 'ATGT', 'ATGA', 'CGCA', 'TGCA', 'GCAT', 'GCAT', 'CATG', 'GATG', 'CATG', 'CATG', 'ATGA', 'ATGC', 'ATGA', 'ATGA', 'TGAT', 'TGAG', 'GATG', 'CATG', 'ATGC', 'ATGA', 'TGAG', 'AGAG', 'GAGA', 'GAGC']
我不确定你想从这里得到什么;您指定d = 1,但您打印的项目各有4个错误。下面是一些计算mismatch_list中出现次数的代码,按频率对结果进行排序(未使用,但稍后可能需要),然后打印所有匹配假定频率为4的结果。
mismatch_count = collections.Counter(mismatch_list)
sorted_match = sorted(list(mismatch_count), key=lambda pair: pair[1], reverse=True)
for item, value in mismatch_count.iteritems():
if value == 4:
print item