Python Iteratorから最後のアイテムを取得するための最もクリーンな方法
-
22-09-2019 - |
質問
Python 2.6のIteratorから最後のアイテムを取得する最良の方法は何ですか?たとえば、たとえば
my_iter = iter(range(5))
最も短いコード /クリーンな取得方法は何ですか 4
から my_iter
?
私はこれをすることができましたが、それはあまり効率的ではないようです:
[x for x in my_iter][-1]
解決
検索コア結果WebパーツのXSLを開き、Microsoftコメントのために検索します.<!-- When empty result set is returned from search -->
。そのカテゴリの下にメッセージを表示するためのXSLテンプレートが表示されるため、インターネット上のコア結果WebパーツのデフォルトのXSLを見つけることも、デフォルトのカスタマイズを使用してコア結果Webパーツからそれを取得することもできます。あなたのものとそれを。あるいは、そのテンプレート内のすべてを置き換えることによって結果がない場合に表示するためにあなた自身のHTMLを書くことができます:)
他のヒント
使う deque
サイズ1の。
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
NB:
通常、上記のソリューションは通常のケースに必要なものですが、大量のデータを扱っている場合、使用する方が効率的です 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]
これは、ラムダのために空のループよりも速くなる可能性は低いですが、おそらく他の誰かにアイデアを与えるでしょう
reduce(lambda x,y:y,my_iter)
iterが空の場合、typeRrorが上げられます
これがあります
list( the_iter )[-1]
反復の長さが本当に壮大である場合 - リストを具体化することでメモリを排出するほど長く - デザインを再考する必要があります。
私は使うだろう reversed
, 、それが繰り返しの代わりにシーケンスのみを取ることを除いて、それはかなりarbitrary意的です。
どんな方法でも、イテレーター全体を実行する必要があります。最大効率では、再びイテレーターを必要としない場合は、すべての値をゴミ箱に捨てることができます。
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))
問題は、イテレーターの最後の要素を取得することについてですが、条件をシーケンスに適用することによってイテレーターが作成された場合、逆転した逆のシーケンスの「最初の」を見つけるために使用でき、適用することによって必要な要素のみを調べることができます。シーケンス自体に逆転します。
考慮された例、
>>> 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
しかし、それは同じくらい速く、実際にはループ方法よりも速いです(どういうわけか)
問題は間違っており、複雑で非効率的な答えにつながることしかできません。イテレーターを取得するには、もちろん、反復可能なものから始めます。これは、ほとんどの場合、最後の要素にアクセスするためのより直接的な方法を提供します。
反復可能なイテレーターを作成すると、要素を通過することに巻き込まれます。なぜなら、それは反復可能なものが提供する唯一のものだからです。
したがって、最も効率的で明確な方法は、最初にイテレーターを作成するのではなく、反復可能なネイティブアクセス方法を使用することです。