找到DNA串中不匹配的最常见的k-mers

时间:2016-02-01 23:18:43

标签: python pattern-matching

我正在尝试解决在字符串中找到不匹配的最常见的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;。即使我弄清楚这个也可能有更多的错误。有谁知道发生了什么?

另一件事是我知道肯定存在更好的算法。有线索吗?

1 个答案:

答案 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