144

Python 2.6のイテレータから最後のアイテムを取得する最良の方法は何ですか?たとえば、

my_iter = iter(range(5))

最短のコード/最もクリーンな方法は4my_iterですか?

私はこれを行うことができましたが、あまり効率的ではないようです:

[x for x in my_iter][-1]
4

14 に答える 14

123
item = defaultvalue
for item in my_iter:
    pass
于 2010-01-26T10:56:42.703 に答える
118

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()
于 2018-01-12T19:07:18.160 に答える
78

dequeサイズ1のを使用してください。

from collections import deque

#aa is an interator
aa = iter('apple')

dd = deque(aa, maxlen=1)
last_element = dd.pop()
于 2010-07-02T23:39:12.083 に答える
35

__reversed__利用可能な場合はおそらく使用する価値があります

if hasattr(my_iter,'__reversed__'):
    last = next(reversed(my_iter))
else:
    for last in my_iter:
        pass
于 2010-02-05T23:01:46.400 に答える
33

単純な:

max(enumerate(the_iter))[1]
于 2011-06-06T11:24:17.293 に答える
23

これはラムダのために空のforループよりも速くなる可能性は低いですが、おそらくそれは他の誰かにアイデアを与えるでしょう

reduce(lambda x,y:y,my_iter)

iterが空の場合、TypeErrorが発生します

于 2010-01-26T11:59:14.187 に答える
10

これがあります

list( the_iter )[-1]

反復の長さが本当に壮大である場合(リストを具体化するとメモリが使い果たされるほど長い場合)、実際に設計を再考する必要があります。

于 2010-01-26T11:42:54.833 に答える
7

イテレータではなくシーケンスのみを使用することreversedを除いて、を使用します。これはかなり恣意的です。

どのように行うにしても、イテレータ全体を実行する必要があります。最大の効率で、イテレータが二度と必要ない場合は、すべての値を破棄することができます。

for last in my_iter:
    pass
# last is now the last item

ただし、これは次善の解決策だと思います。

于 2010-01-26T10:57:54.157 に答える
4

toolzライブラリは優れたソリューションを提供します。

from toolz.itertoolz import last
last(values)

ただし、コア以外の依存関係を追加することは、この場合にのみ使用する価値がない可能性があります。

于 2018-11-27T20:00:09.550 に答える
1

同様のコードについては、次のコードを参照してください。

http://excamera.com/sphinx/article-islast.html

あなたはそれを使って最後のアイテムを拾うかもしれません:

[(last, e) for (last, e) in islast(the_iter) if last]
于 2011-01-12T18:08:48.983 に答える
0

私はただ使うだろうnext(reversed(myiter))

于 2017-10-24T18:48:49.337 に答える
0

問題は、イテレータの最後の要素を取得することですが、シーケンスに条件を適用してイテレータを作成する場合は、reverseを使用して、必要な要素のみを確認し、逆シーケンスの「最初の」を見つけることができます。シーケンス自体とは逆になります。

不自然な例、

>>> seq = list(range(10))
>>> last_even = next(_ for _ in reversed(seq) if _ % 2 == 0)
>>> last_even
8
于 2019-05-17T18:19:17.890 に答える
0

または、無限イテレータの場合は、次を使用できます。

from itertools import islice 
last = list(islice(iterator(), 1000))[-1] # where 1000 is number of samples 

その時は遅くなると思いましたがdeque、forループ方式よりも速く、実際には速くなります(どういうわけか)

于 2019-05-31T22:17:07.033 に答える
-7

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

イテレータからイテレータを作成すると、それがイテレータが提供する唯一のものであるため、要素を通過することに固執します。

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

于 2010-06-29T02:37:01.527 に答える