选择汉明距离为零的读数

时间:2015-06-19 03:30:43

标签: python python-2.7 bioinformatics biopython

我有一个fastq文件,比如-1。我有一个reads.fastq字符串列表。对于7-mer中的每次读取,我想检查它是否包含列表中的至少一个reads.fastq字符串。条件是,如果找到匹配(7-mer),则将读取写入数组hamming distance ==0,并匹配fastq文件中的下一个读取。如果未找到匹配,则循环继续直到找到匹配。输出数组由唯一读取组成,因为匹配循环在找到第一个匹配后终止。我编写了以下代码,但输出数组中的读取并不是唯一的,因为所有与汉明距离为零的匹配都会被报告。请建议编辑:

chosen_reads

2 个答案:

答案 0 :(得分:2)

当你找到一个汉明距离为0的字符串时,你当前的代码没有突破循环以从read读取下一个reads.fastq,你应该使用标志来决定何时爆发,并在需要突破时将该标志分配给True值 -

def hamming(s1, s2):
    #Return the Hamming distance between equal-length sequences
    if len(s1) != len(s2):
        raise ValueError("Undefined for sequences of unequal length")
    return sum(ch1 != ch2 for ch1, ch2 in zip(s1, s2))

for x in Bio.SeqIO.parse("reads.fastq","fastq"):
        reads_array.append(x)

nmer = 7

l_chosen = ['gttattt','attattt','tgctagt']
chosen_reads = []

for x in reads_array:
        s2 = str(x.seq)
        breakFlag = False
        for s in [s2[i:i+nmer] for i in range(len(s2)-nmer-1)]:
                for ds in l_chosen:
                        dist = hamming(ds,s)
                        if dist == 0:
                                print s2, s,ds,dist
                                chosen_reads.append(x)
                                breakFlag = True
                                break;
                if breakFlag:
                        break;

并且您确定要将x附加到chosen_reads,似乎不对,要获得唯一匹配,您可能应附加s2字符串和匹配的{ {1}}而不是吗?如果这是您想要的,您可以将元组添加到ds,而不是当前的附加逻辑 -

chosen_reads

答案 1 :(得分:0)

如果我理解你的要求,汉明距离试图找到3个“选定”字符串中的至少一个。你正在做的迭代是缓慢的,试图爆发可能是丑陋的。

我可能会建议a regex会有所帮助。您可以自动创建匹配字符串:

import re
chosen_re = re.compile('|'.join(l_chosen))

chosen_reads = [x for x in reads_array if chosen_re.search(str(s.seq))]

你将很难击败正则表达式引擎的速度