2017-04-16 20 views
1

我想了解Python的迭代器在pysam module的上下文中。通過在所謂的AlignmentFile類上使用fetch方法,可以獲得由來自文件file的記錄組成的正確的迭代器iter。我可以使用各種不同的方法來訪問每個記錄(迭代器),比如名字與query_namePython消費一對迭代器

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) 

調用下一個()可能不是百萬記錄的正確方法,但是如何使用for循環在成對迭代中使用相同的迭代器。我查看了itertools和SO Iterate an iterator by chunks (of n) in Python? [duplicate](甚至是重複的!)和What is the most 「pythonic」 way to iterate over a list in chunks?的石斑魚配方,但無法使其正常工作。

+1

*「不能得到它的工作」 * - 正是你嘗試什麼,什麼地方出了錯?給一個[mcve]。注意你通常應該調用'next(thing)',而不是'thing .__ next __()'。 – jonrsharpe

回答

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) 
+0

是的,所以我只有一個迭代器,我想通過向r1和r2添加每個第二個迭代器。 – user3375672

+1

@ user3375672沒有什麼能夠阻止你將兩次相同的參數提供給'zip',即'iterator_1 == iterator_2'。 – timgeb