如何同时处理2台FASTA发电机

时间:2014-09-11 19:38:57

标签: python

这似乎是微不足道的,但它让我很难过。我只想同时处理两个fasta生成器,以便比较一个文件的第一个头和序列与另一个文件的第一个头和序列,第二个到第二个,依此类推,直到两个文件都完成。

两个fasta文件具有相同数量的序列,并且它们被排序为一对的2个读取,例如fasta1的第一个序列和fasta 2的第一个序列是读对,依此类推直到文件的末尾。

我有一个生成器,它为fasta文件的每个序列提供了标题和序列

def fileParse (self):
    # get file from __init__ and open.
    # parse header and sequence
    yield (header, sequence)

然而,我似乎无法弄清楚如何同时迭代两个文件。我从这开始:

# x class variable sends first fasta
# y class variable sends second fasta 
for header, sequence in x.fileParse():
    for header2, sequence2 in y.fileParse():
        # compare headers and evaluate.

很明显,这里的问题是我将一个文件中的每个标题与另一个文件中的每个标题进行比较,其中我只想将第一个标题与第一个标题进行比较,第二个标题与第二个标题进行比较,依此类推。

我遇到困难,因为好像我总是需要遍历生成器。也许我需要调整genrator方法本身来同时生成两个文件的标题和序列?

谢谢

1 个答案:

答案 0 :(得分:2)

我相信zip正是您所寻找的:

for (h1, s1), (h2, s2) in zip(x.fileParse(), y.fileParse()):

恕我直言,zip最容易通过一个例子来理解:

In [43]: range(5)
Out[43]: [0, 1, 2, 3, 4]

In [44]: range(3,8)
Out[44]: [3, 4, 5, 6, 7]

In [45]: zip(range(5), range(3,8))
Out[45]: [(0, 3), (1, 4), (2, 5), (3, 6), (4, 7)]

P.S。你的问题暗示你自己正在实施一个fasta读者。如果是这种情况,你可能想看看BioPython的SeqIO