2016-03-24 10 views
2

異なるサイズの2つのリストを反復したいが、同じペースでは反復しない(私は並列反復の答えしか見つけなかった)。たとえば、同じ種類の要素を含む2つのソート済みリストを考えてみましょう。これらは、2つのリストの共通のトラバーサルを使用して、1つのリストまたは両方のリストにあるという事実に従って要素に対して何かしたいと考えています。異なるサイズの2つのリストを反復処理するときにStopIteration例外を処理します

インデックスを使用してその方法を知っていましたが、イテレータで正しく行う方法はありますか?

呼び出すとStopIterationが発生した
list1=[...] 
list2=[...] 

it1=iter(list1) 
it2=iter(list2) 
try: 
    while True: 
     e1=it1.next() 
     e2=it2.next() 

     while compare(e1,e2): 
      doSomething1(e1) 
      e1=it1.next() 

     while compare(e2,e1): 
      doSomething2(e2) 
      e2=it2.next() 

     doSomething3(e1,e2) 
except StopIteration: 
    pass 

# do something with the rest of the list that is at end 

、私は最後にあるリストを知らないと私は残りの要素にアクセスする方法がわからない:(次の呼び出し

私はの線に沿って何かを持っています)が例外をチェックすると、長いリストの要素をスキップし、直接e1にアクセスするか、e2を使用すると、短いリストの最後の要素にもう一度アクセスできるようになります。

私は(次の各周りを除いて/試しを持つようないくつかの回避策を)想像しますが、すべて私のアイデアすることができますだけでインデックスを使用するよりも、より複雑なようだ...

上記のコードの簡単な作業たとえば、

def compare(e1,e2):  return e1<e2 
def doSomething1(e1): print "list1: %d"%e1 
def doSomething2(e1): print "list2: %d"%e1 
def doSomething3(e1,e2): print "common: %d"%e1 

list1=[1,2,5,6,8,10,23,56] 
list2=[3,4,5,10] 
+0

通常、リストに「None」値がない場合は、他のリストの長さに一致するように短いリストを 'None'で埋め込むことができます。 – Selcuk

+0

私は2つのイテレータを並行して進めたくないので、助けてくれるとは思わない。 – romaric

答えて

1

イテレータを反復処理するために残りの要素の(推定)番号が返され__length_hint__を有して使用することができます。これの精度はイテレーターのタイプに依存しますが、CPython以外の実装ではそれが動作することは保証できません。

x = [1,2,3,4,5] 
y = iter(x) 
print y.__length_hint__() # prints 5 
print y.next # prints 1 
... 

StopIterationキャッチでは、どのイテレータにメンバーが残っているかを確認し、それに基づいて動作することができます。

list1=[...] 
list2=[...] 

it1=iter(list1) 
it2=iter(list2) 
try: 
    while True: 
     e1=it1.next() 
     e2=it2.next() 

     while compare(e1,e2): 
      doSomething1(e1) 
      e1=it1.next() 

     while compare(e2,e1): 
      doSomething2(e2) 
      e2=it2.next() 

     doSomething3(e1,e2) 
except StopIteration: 
    if it1.__length_hint__() > 0: 
     #handle unhandled list1 items. 
    elif it2.__length_hint__() > 0: 
     #handle unhandled list2 items. 
    else: 
     #both lists have been exhausted. 
+1

情報をありがとう、それは私のために働く。私はPython 3.4(https://docs.python.org/dev/library/operator.html#operator.length_hint)から関数operator.length_hint()があることを知りました。 – romaric

関連する問題