Python 2.6のイテレータから最後のアイテムを取得する最良の方法は何ですか?たとえば、
my_iter = iter(range(5))
取得する最短コード/クリーンな方法は何ですか 4
からではmy_iter
?
私はこれを行うことができましたが、それは非常に効率的ではないようです:
[x for x in my_iter][-1]
iter(range(5))
Python 2.6のイテレータから最後のアイテムを取得する最良の方法は何ですか?たとえば、
my_iter = iter(range(5))
取得する最短コード/クリーンな方法は何ですか 4
からではmy_iter
?
私はこれを行うことができましたが、それは非常に効率的ではないようです:
[x for x in my_iter][-1]
iter(range(5))
回答:
item = defaultvalue
for item in my_iter:
pass
None
?これがまさにNone
目的です。一部の機能固有のデフォルト値が正しい可能性があることを示唆していますか?イテレータが実際に反復しない場合は、アウトオブバンド値は、より多くのいくつかの誤解を招くような機能固有のデフォルトより有意義。
None
デフォルト値として使用する場合は、それを選択します。どれもが常に最も賢明なデフォルトであるとは限らず、帯域外になることさえありません。個人的には、 'defaultvalue = object()'を使用して、それが本当に一意の値であることを確認する傾向があります。デフォルトの選択はこの例の範囲外であることを示しています。
None
それが最終値として持つイテレータの違いを区別することはおそらく有用です
deque
サイズ1のa を使用します。
from collections import deque
#aa is an interator
aa = iter('apple')
dd = deque(aa, maxlen=1)
last_element = dd.pop()
Python 3.xを使用している場合:
*_, last = iterator # for a better understanding check PEP 448
print(last)
Python 2.7を使用している場合:
last = next(iterator)
for last in iterator:
continue
print last
サイドノート:
通常、上記のソリューションは通常のケースで必要なものですが、大量のデータを処理する場合はdeque
、サイズ1 を使用する方が効率的です。(ソース)
from collections import deque
#aa is an interator
aa = iter('apple')
dd = deque(aa, maxlen=1)
last_element = dd.pop()
*lst, last = some_iterable
。
_
はpythonの特別な変数であり、最後の値を保存するため、または値を気にしないのでクリーンアップするために使用されます。
単純な:
max(enumerate(the_iter))[1]
enumerate
は次の(index, value)
ように返されるため機能します(0, val0), (1, val1), (2, val2)
... ...そして、デフォルトmax
ではタプルのリストが与えられると、2つの最初の値が等しくない限り、タプルの最初の値のみと比較します。インデックスを表すからです。次に、末尾の添え字は、maxが(idx、value)タプル全体を返すのに対して、にのみ関心があるためvalue
です。面白いアイデア。
これはラムダのために空のforループよりも速くなる可能性は低いですが、おそらく他の誰かにアイデアを与えるでしょう
reduce(lambda x,y:y,my_iter)
iterが空の場合、TypeErrorが発生します
TypeError
空の反復可能なため、あなたはまたの初期値を経由して、デフォルト値を供給することができreduce()
、例えば、last = lambda iterable, default=None: reduce(lambda _, x: x, iterable, default)
。
これがあります
list( the_iter )[-1]
反復の長さが本当に壮大な場合、つまりリストを具体化するとメモリが使い果たされる場合は、設計を再考する必要があります。
私は使うだろう reversed
ますが、イテレータの代わりにシーケンスのみを取る、かなり恣意的です。
どのような方法でも、イテレータ全体を実行する必要があります。最大の効率で、イテレータが二度と必要ない場合は、すべての値を破棄することができます。
for last in my_iter:
pass
# last is now the last item
しかし、これは次善のソリューションだと思います。
同様のコードについては、このコードを参照してください。
http://excamera.com/sphinx/article-islast.html
あなたはそれを使って最後のアイテムを拾うのに使うかもしれません:
[(last, e) for (last, e) in islast(the_iter) if last]
islast
回答に含めてください(meta.stackexchange.com/questions/8231/…を参照)。
質問は間違っており、複雑で非効率的な回答しか導きません。イテレータを取得するには、もちろん、反復可能なものから始めます。これにより、ほとんどの場合、最後の要素にアクセスするためのより直接的な方法が提供されます。
iterableからiteratorを作成すると、それがiterableが提供する唯一のものであるため、要素の処理に行き詰まります。
したがって、最も効率的で明確な方法は、最初にイテレータを作成するのではなく、イテラブルのネイティブアクセスメソッドを使用することです。