2017-06-15 2 views
1

I次のユースケースがあります:イテレータが空でない場合Pythonでイテレータの長さを使い果たすことなくどのように見つけることができますか?

  1. コールpythonで
  2. チェックをイテレータを返す関数を
  3. 、その後、

しかし、いくつかの操作を行い空でない場合イテレータが空であるかどうかをチェックするプロセスは、それを空にしているようです。これを行うより良い方法はありますか?

+2

いいえ、以来、およびイテレータは無限* *することができます: 'itertools.repeat'例えば。 –

+0

iterableが空であるかどうかを確認するために、iterableの長さは必要ありません。あなたはそれから1つの項目を取ろうとする必要があります。ユースケースによっては、残りのiterableを処理する前にその項目を直接使用することもできますし、itemとiterableを使用して_new_ iterableを作成して処理することもできます。 – mgilson

+0

通常はイテレータを反復処理し、空の場合は反復処理を行いません。 –

答えて

2

イテレータのコピーを取得してオリジナルとは独立して操作できるようにするには、itertools.teeを使用します。イテレータが空であるかどうかは、イテレータがStopIterationをスローするかどうかを調べることによってテストできます。

だからあなたのような何かを行うことができます:ほとんどのイテレータは長さ自体を知らない

def isempty(it): 
    try: 
     itcpy = itertools.tee(it,1)[0] 
     itcpy.next() 
     return False 
    except StopIteration: 
     return True 

def empty_iterator(): 
    if False: 
     yield 

it = empty_iterator() 
if not isempty(it): 
    # won't print 
    print(len(list(it))) 

it = xrange(4) 
if not isempty(it): 
    # will print 
    print(len(list(it))) 
+1

これは動作しません。 'xrange'はイテレータではなく、* iterable *です。これを 'x = xrange(4);で試してください。 it = iter(x) 'です。あなたが 'isempty(it)'をしたら、 'len(list(it))'を試してみるでしょう。 'xrange'はシーケンス型なので、空であるかどうかを調べることができます。単純に 'if x:'を実行します。 'xrange'オブジェクトがイテレータではないと私には信じられないなら' bool(xrange(0)) 'と' bool(xrange(1)) 'を –

+0

BTWしてみてください。' next(xrange(10)) 'とPythonインタプリタがそれについて何を言わなければならないかを見てください。 –

関連する問題