I次のユースケースがあります:イテレータが空でない場合Pythonでイテレータの長さを使い果たすことなくどのように見つけることができますか?
- コールpythonで
- チェックをイテレータを返す関数を
- 、その後、
しかし、いくつかの操作を行い空でない場合イテレータが空であるかどうかをチェックするプロセスは、それを空にしているようです。これを行うより良い方法はありますか?
I次のユースケースがあります:イテレータが空でない場合Pythonでイテレータの長さを使い果たすことなくどのように見つけることができますか?
しかし、いくつかの操作を行い空でない場合イテレータが空であるかどうかをチェックするプロセスは、それを空にしているようです。これを行うより良い方法はありますか?
イテレータのコピーを取得してオリジナルとは独立して操作できるようにするには、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)))
これは動作しません。 'xrange'はイテレータではなく、* iterable *です。これを 'x = xrange(4);で試してください。 it = iter(x) 'です。あなたが 'isempty(it)'をしたら、 'len(list(it))'を試してみるでしょう。 'xrange'はシーケンス型なので、空であるかどうかを調べることができます。単純に 'if x:'を実行します。 'xrange'オブジェクトがイテレータではないと私には信じられないなら' bool(xrange(0)) 'と' bool(xrange(1)) 'を –
BTWしてみてください。' next(xrange(10)) 'とPythonインタプリタがそれについて何を言わなければならないかを見てください。 –
いいえ、以来、およびイテレータは無限* *することができます: 'itertools.repeat'例えば。 –
iterableが空であるかどうかを確認するために、iterableの長さは必要ありません。あなたはそれから1つの項目を取ろうとする必要があります。ユースケースによっては、残りのiterableを処理する前にその項目を直接使用することもできますし、itemとiterableを使用して_new_ iterableを作成して処理することもできます。 – mgilson
通常はイテレータを反復処理し、空の場合は反復処理を行いません。 –