Python 成对使用迭代器

Python consume an iterator pair-wise

我试图在 pysam module 的上下文中理解 Python 的迭代器。通过在所谓的 AlignmentFile class 上使用 fetch 方法,可以得到一个由文件 file 中的记录组成的正确迭代器 iter。我可以使用各种方法来访问每个记录(可迭代),例如带有 query_name 的名称:

import pysam
iter = pysam.AlignmentFile(file, "rb", check_sq=False).fetch(until_eof=True)
for record in iter:
  print(record.query_name)

碰巧记录是成对出现的,所以人们会喜欢这样的东西:

while True:
  r1 = iter.__next__() 
  r2 = iter.__next__()
  print(r1.query_name)     
  print(r2.query_name)

调用 next() 可能不是百万条记录的正确方法,但是如何使用 for 循环在成对的可迭代对象中使用相同的迭代器。我查看了 itertools and the SOs Iterate an iterator by chunks (of n) in Python? [duplicate] (even a duplicate!) and What is the most “pythonic” way to iterate over a list in chunks? 中的石斑鱼食谱,但无法使用。

首先,不要使用变量名iter,因为那已经是内置函数的名称了。

要回答您的问题,只需在迭代器上使用 itertools.izip (Python 2) 或 zip (Python 3)。

您的代码可能看起来很简单

for next_1, next_2 in zip(iterator, iterator):
    # stuff

编辑:糟糕,我原来的答案一直都是正确的,不要介意 itertools 配方。

编辑 2:如果您处理可能产生不均匀数量对象的迭代器,请考虑 itertools.izip_longest

>>> from itertools import izip_longest
>>> iterator = (x for x in (1,2,3))
>>> 
>>> for next_1, next_2 in izip_longest(iterator, iterator):
...     next_1, next_2
... 
(1, 2)
(3, None)