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)
我试图在 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)