質問

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 しかし、それは同じくらい速く、実際にはループ方法よりも速いです(どういうわけか)

問題は間違っており、複雑で非効率的な答えにつながることしかできません。イテレーターを取得するには、もちろん、反復可能なものから始めます。これは、ほとんどの場合、最後の要素にアクセスするためのより直接的な方法を提供します。

反復可能なイテレーターを作成すると、要素を通過することに巻き込まれます。なぜなら、それは反復可能なものが提供する唯一のものだからです。

したがって、最も効率的で明確な方法は、最初にイテレーターを作成するのではなく、反復可能なネイティブアクセス方法を使用することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top