7

インテレータの最初と最後の要素をチェックしようとしています。数千のエントリがあるため、迅速な確認方法が必要です。この投稿が見つかった場合、それは私をこの戦略に導きました。

first = True
for value in iterator:
   if first:
      do_stuff_to_first_iter
      first = False
   else:
      pass
do_stuff_to_last_iter

これを達成するためのより迅速な方法について意見はありますか? どうもありがとう!

4

4 に答える 4

28

next()次の関数で最初の値を取得します。

first = last = next(iterable, defaultvalue)
for last in iterable:
    pass

これは、イテラブルが有限であることを前提としています。

空の iterable の場合、firstandlastは に設定されdefaultvalueます。要素が 1 つだけの iterable の場合、first両方lastともその 1 つの要素を参照します。他の有限イテラブルの場合first、最初の要素、last最後の要素があります。

于 2013-11-20T19:01:52.503 に答える
3

リンクされた質問に対する私の回答に基づいて:

__reversed__利用できるなら利用する価値はありそうです。イテレータを提供していて、実装する賢明な方法がある場合__reversed__(つまり、端から端まで反復せずに)、それを行う必要があります。

first = last = next(my_iter)
if hasattr(my_iter,'__reversed__'):
    last = next(reversed(my_iter))
else:
    for last in my_iter:
        pass
于 2013-11-20T19:33:05.800 に答える
1

maxlen が 1 の両端キューを使用して、有限反復子の最後の要素をすばやく取得できます。

>>> from collections import deque
>>> last_getter = deque(maxlen=1)
>>> seq = range(10000)
>>> iseq = iter(seq)
>>>
>>> first = last = next(iseq, None)
>>> last_getter.extend(iseq)
>>> if last_getter: last = last_getter[0]
...
>>> print (first, last)
0 9999
于 2013-11-20T20:24:26.117 に答える
1

私のテストによると、islicefor: passはorより最大 3 倍高速ですdeque。ただし、これには、アイテムがいくつあるかを知る必要があります。

last = next(islice(iterable, length - 1, length))

または、完全な長さがわからないが、少なくとも .nn

rest = islice(iterable, n, None)
last = next(rest)
for last in rest:
    pass
于 2014-02-12T19:56:57.450 に答える