Python 选择汉明距离为零的读数

Python 选择汉明距离为零的读数,python,python-2.7,bioinformatics,biopython,Python,Python 2.7,Bioinformatics,Biopython,我有一个fastq文件,比如reads.fastq。我有一个7-mer字符串列表。对于每个读入的reads.fastq,我想检查它是否包含列表中至少一个7-mer字符串。条件是,如果找到匹配项(hamming distance==0),则将读取的内容写入所选数组reads,并匹配从fastq文件读取的下一个内容。如果未找到匹配项,循环将继续,直到找到匹配项。输出数组由唯一读取组成,因为一旦找到第一个匹配项,匹配循环就会终止。我编写了以下代码,但输出数组中的读取不是唯一的,因为报告了所有汉明距离为

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

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)
    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)

当前代码没有从循环中中断以从
reads中读取下一个
read
。fastq
当它找到汉明距离为0的字符串时,应该使用标志来决定何时中断,并在需要中断时将该标志指定为真值-

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
附加到
selected\u reads
,这似乎是错误的,为了获得唯一的匹配,您可能应该将
s2
字符串和匹配的
ds
附加,对吗?如果这是您想要的,您可以像下面那样将元组附加到所选的
reads
,而不是当前的附加逻辑-

chosen_reads.append((ds, s2))

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

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

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

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

你将很难打败regex引擎的spead

我删除了最后一个if breakFlag:break;由于这并不是反复阅读,其他建议也起了作用。我确实想将整个记录写入所选的读取以供进一步使用哦,是的,对不起,不,您不需要最后的
,如果breakFlag
,将在回答时修复。