Python 使用多个HSP删除爆炸命中

Python 使用多个HSP删除爆炸命中,python,bioinformatics,biopython,blast,Python,Bioinformatics,Biopython,Blast,我有一个大的BLAST(outpmt 6)输出文件。我对在这个文件中寻找对等同源物感兴趣,但我想排除多个HSP的命中,例如 Seq1 Seq2 (alignment 1: evalue bitscore etc) Seq1 Seq2 (alignment 2: evalue bitscore etc) Seq3 Seq4 (alignment 1: evalue bitscore etc) Seq4 Seq5 (alignment 1: evalu

我有一个大的BLAST(outpmt 6)输出文件。我对在这个文件中寻找对等同源物感兴趣,但我想排除多个HSP的命中,例如

Seq1    Seq2    (alignment 1: evalue bitscore etc)
Seq1    Seq2    (alignment 2: evalue bitscore etc)
Seq3    Seq4    (alignment 1: evalue bitscore etc)
Seq4    Seq5    (alignment 1: evalue bitscore etc)
Seq2    Seq1    (alignment 1: evalue bitscore etc)
Seq2    Seq1    (alignment 2: evalue bitscore etc)
Seq4    Seq3    (alignment 1: evalue bitscore etc)
在这种情况下,仅返回序列3和序列4之间的比对,因为序列1和序列2之间的比对共享多个HSP,而序列4和序列5之间的比对仅具有单向命中。我希望用python来实现这一点,这样我就可以将它与我的程序的其余部分一起插入

有谁能给我一些建议,让我朝着正确的方向走


谢谢

Python就可以了

from collections import defaultdict

hsp_count = defaultdict(int)
for line in open("file"):
    seq1, seq2, _ = line.split(maxsplit=2)
    hsp_count[seq1, seq2] += 1

already_checked = set()
for (seq1, seq2), val1 in hsp_count.items():
    if (seq2, seq1) in already_checked:
        continue
    val2 = hsp_count.get((seq2, seq1))
    if not val2:
        continue
    already_checked.add((seq1, seq2))
    if val1 == 1 and val2 == 1:
        print(seq1, seq2)

考虑一下这里,我建议提供一个我现在看到的“黑暗”,我已经检查了一个双反转。如果要检查是否已检查一对,请仅在检查时将其反转,而不要在将其插入集合时反转。检查顺序不重要的唯一对的一种更稳健的方法是使用排序后的
检查有序对,虽然更稳健,更不容易出错,但速度也较慢,但在您的情况下,这可能无关紧要。