2

我试图在pysam 模块的上下文中理解 Python 的迭代器。通过fetch在所谓的 AlignmentFile 类上使用该方法,可以获得一个iter由文件中的记录组成的适当迭代器file。我可以使用各种方法来访问每条记录(可迭代),例如名称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中的 grouper recipe 和 SOs Iterate an iterator by chunks (of n) in Python?[重复](甚至是重复的!)以及以块为单位迭代列表的最“pythonic”方式是什么?但无法让它工作。

4

1 回答 1

2

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

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

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

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)
于 2017-04-16T21:09:48.660 回答