Python 2.6のイテレータから最後のアイテムを取得する最良の方法は何ですか?たとえば、
my_iter = iter(range(5))
最短のコード/最もクリーンな方法は4
何my_iter
ですか?
私はこれを行うことができましたが、あまり効率的ではないようです:
[x for x in my_iter][-1]
Python 2.6のイテレータから最後のアイテムを取得する最良の方法は何ですか?たとえば、
my_iter = iter(range(5))
最短のコード/最もクリーンな方法は4
何my_iter
ですか?
私はこれを行うことができましたが、あまり効率的ではないようです:
[x for x in my_iter][-1]
item = defaultvalue
for item in my_iter:
pass
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()
deque
サイズ1のを使用してください。
from collections import deque
#aa is an interator
aa = iter('apple')
dd = deque(aa, maxlen=1)
last_element = dd.pop()
__reversed__
利用可能な場合はおそらく使用する価値があります
if hasattr(my_iter,'__reversed__'):
last = next(reversed(my_iter))
else:
for last in my_iter:
pass
単純な:
max(enumerate(the_iter))[1]
これはラムダのために空のforループよりも速くなる可能性は低いですが、おそらくそれは他の誰かにアイデアを与えるでしょう
reduce(lambda x,y:y,my_iter)
iterが空の場合、TypeErrorが発生します
これがあります
list( the_iter )[-1]
反復の長さが本当に壮大である場合(リストを具体化するとメモリが使い果たされるほど長い場合)、実際に設計を再考する必要があります。
イテレータではなくシーケンスのみを使用することreversed
を除いて、を使用します。これはかなり恣意的です。
どのように行うにしても、イテレータ全体を実行する必要があります。最大の効率で、イテレータが二度と必要ない場合は、すべての値を破棄することができます。
for last in my_iter:
pass
# last is now the last item
ただし、これは次善の解決策だと思います。
toolzライブラリは優れたソリューションを提供します。
from toolz.itertoolz import last
last(values)
ただし、コア以外の依存関係を追加することは、この場合にのみ使用する価値がない可能性があります。
同様のコードについては、次のコードを参照してください。
http://excamera.com/sphinx/article-islast.html
あなたはそれを使って最後のアイテムを拾うかもしれません:
[(last, e) for (last, e) in islast(the_iter) if last]
私はただ使うだろうnext(reversed(myiter))
問題は、イテレータの最後の要素を取得することですが、シーケンスに条件を適用してイテレータを作成する場合は、reverseを使用して、必要な要素のみを確認し、逆シーケンスの「最初の」を見つけることができます。シーケンス自体とは逆になります。
不自然な例、
>>> seq = list(range(10))
>>> last_even = next(_ for _ in reversed(seq) if _ % 2 == 0)
>>> last_even
8
または、無限イテレータの場合は、次を使用できます。
from itertools import islice
last = list(islice(iterator(), 1000))[-1] # where 1000 is number of samples
その時は遅くなると思いましたがdeque
、forループ方式よりも速く、実際には速くなります(どういうわけか)
質問は間違っており、複雑で非効率的な答えにつながるだけです。イテレータを取得するには、もちろん、反復可能なものから始めます。これにより、ほとんどの場合、最後の要素にアクセスするためのより直接的な方法が提供されます。
イテレータからイテレータを作成すると、それがイテレータが提供する唯一のものであるため、要素を通過することに固執します。
したがって、最も効率的で明確な方法は、最初にイテレータを作成するのではなく、イテレータのネイティブアクセスメソッドを使用することです。