2017-04-16 15 views
1

私はpysam moduleのコンテキストでPythonのイテレータを理解しようとしています。いわゆるAlignmentFileクラスのfetchメソッドを使用すると、ファイルfileからのレコードで構成される適切なイテレータiterが得られます。私が使用し、様々な方法がquery_nameで各レコード(反復可能)、インスタンスの名前にアクセスすることができます。Pythonは反復子をペアで使用します

while True: 
    r1 = iter.__next__() 
    r2 = iter.__next__() 
    print(r1.query_name)  
    print(r2.query_name) 

import pysam 
iter = pysam.AlignmentFile(file, "rb", check_sq=False).fetch(until_eof=True) 
for record in iter: 
    print(record.query_name) 

1のようなものをご希望のようにレコードが対になっていることが起こりますを次に呼び出す()はおそらく数百万のレコードに対して正しい方法ではありませんが、forループを使用してiterableのペアで同じイテレータをどのように使用することができますか?私は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?からグルーパーレシピを見ましたが、動作させることはできません。

+1

「それが仕事を得ることができない」* * - まさにあなたがしようと、何が間違っていたのですか? [mcve]を与える。通常、 'thing .__ next __()'ではなく 'next(thing)'を呼び出すべきです。 – jonrsharpe

答えて

1

最初に、変数名iterは、既に組み込み関数の名前なので、使用しないでください。

質問に答えるには、イテレータでitertools.izip(Python 2)またはzip(Python 3)を使用するだけです。おっと、私のオリジナルの答えは、すべてに沿って正しいものだったitertoolsレシピを気にしない:

あなたのコードは編集

for next_1, next_2 in zip(iterator, iterator): 
    # stuff 

のように単純に見えることがあります。

編集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

はい、私は1つのイテレータしか持っていないので、r1とr2に毎秒繰り返し可能なものを追加したいと思っています。 – user3375672

+1

@ user3375672 'zip'に同じ引数を2度与えることを妨げるものは何もありません。つまり、' iterator_1 == iterator_2'です。 – timgeb

関連する問題