在文字

时间:2016-02-02 03:12:03

标签: 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的模式,下面是我的代码:

import collections

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) - 1):
    for j in xrange(i+1, len(out_result)):
        if hamming_distance(str(out_result[i]), str(out_result[j])) <= in_mistake:
            mismatch_list.extend([out_result[i], out_result[j]])

mismatch_count = collections.Counter(mismatch_list)
print [key for key,val in mismatch_count.iteritems() if val == max(mismatch_count.values())]

而不是预期的结果,我得到了“CATG&#39;”。有人知道我的代码有问题吗?

1 个答案:

答案 0 :(得分:1)

在你最后一行代码之前,这一切看起来都很棒:

print [key for key,val in mismatch_count.iteritems() if val == max(mismatch_count.values())]

由于CATG得分高于其他任何一个kmer,你只会得到那一个答案。看看:

>>> print mismatch_count.most_common()
[('CATG', 9), ('ATGA', 6), ('GCAT', 6), ('ATGC', 4), ('TGCA', 4), ('ATGT', 4), ('GATG', 4), ('GTTG', 2), ('TGAG', 2), ('TTGC', 2), ('CGCA', 2), ('TGAT', 1), ('GTCG', 1), ('AGAG', 1), ('ACGT', 1), ('TCGC', 1), ('GAGC', 1), ('GAGA', 1)]

找出你真正希望从这个结果中得到什么。

我认为修复是为了改变你的第二个顶级水平&#39;循环读取如下:

for t_kmer in set(out_result):
    for s_kmer in out_result:
        if hamming_distance(t_kmer, s_kmer) <= in_mistake:
            mismatch_list.append(t_kmer)

这会产生类似于您所期望的结果:

>>> print mismatch_count.most_common()
[('ATGC', 5), ('ATGT', 5), ('GATG', 5), ('CATG', 4), ('ATGA', 4), ('GTTG', 3), ('CGCA', 3), ('GCAT', 3), ('TGAG', 3), ('TTGC', 3), ('TGCA', 3), ('TGAT', 2), ('GTCG', 2), ('AGAG', 2), ('ACGT', 2), ('TCGC', 2), ('GAGA', 2), ('GAGC', 2), ('TGTC', 1), ('CGTT', 1), ('AGCT', 1)]