Python использует итератор попарно
Я пытаюсь понять итераторы Python в контексте модуля pysam. Используя 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 и SO. Итерировать итератор по кусочкам (из n) в Python? [дубликата] (даже дубликата!) и каков наиболее "питонный" способ перебора списка в виде фрагментов? но не могу заставить его работать.
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)