【问题标题】:Python consume an iterator pair-wisePython 成对使用迭代器
【发布时间】:2017-09-12 12:29:02
【问题描述】:

我试图在pysam module 的上下文中理解 Python 的迭代器。通过在所谓的 AlignmentFile 类上使用fetch 方法,可以得到一个适当的迭代器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 和 SOs Iterate an iterator by chunks (of n) in Python? [duplicate](甚至是重复的!)和 What is the most “pythonic” way to iterate over a list in chunks? 的石斑鱼食谱,但无法让它发挥作用。

【问题讨论】:

  • "cannot get it to work" - 您具体尝试了什么,出了什么问题?给minimal reproducible example。请注意,您通常应该调用next(thing),而不是thing.__next__()

标签: python iterator next pysam


【解决方案1】:

首先,不要使用变量名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)

【讨论】:

  • 是的,所以我只有一个迭代器,我想通过将每一秒可迭代添加到 r1 和 r2 中。
  • @user3375672 没有什么可以阻止您向zip 提供两次相同的参数,即iterator_1 == iterator_2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2018-11-01
  • 1970-01-01
  • 2018-03-14
  • 2020-03-31
  • 2021-07-03
  • 2017-12-18
相关资源
最近更新 更多