从Python迭代器中获取最后一项的最简单的方法

从Python 2.6的迭代器中获取最后一项的最好方法是什么? 比如说

my_iter = iter(range(5)) 

什么是从my_iter获得4的最短代码/最干净的方式?

我可以做到这一点,但似乎并不高效:

 [x for x in my_iter][-1] 
 item = defaultvalue for item in my_iter: pass 

使用大小为1的deque

 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 

由于lambda,这不太可能比empty for循环更快,但也许会给别人一个想法

 reduce(lambda x,y:y,my_iter) 

如果iter为空,则会引发TypeError

简单如下:

 max(enumerate(the_iter))[1] 

我会使用reversed ,除了它只需要序列而不是迭代器,这似乎是任意的。

任何你这样做的方式,你将不得不遍历整个迭代器。 以最高的效率,如果你再也不需要迭代器了,那么你可以把所有的值都删掉:

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

不过,我认为这是一个次优的解决scheme。

有这个

 list( the_iter )[-1] 

如果迭代的长度真的是史诗般的 – 只要实现列表将耗尽内存 – 那么你真的需要重新考虑devise。

看到这个代码类似的东西:

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

你可以用它来拾取最后一项:

 [(last, e) for (last, e) in islast(the_iter) if last] 

我只会使用next(reversed(myiter))

问题是错误的,只能导致一个复杂而低效的答案。 要获得一个迭代器,你当然要从可迭代的东西开始,在大多数情况下,这将提供一个更直接的方式来访问最后一个元素。

一旦你从一个迭代器创build了一个迭代器,你就会陷入这个元素中,因为这是迭代器提供的唯一的东西。

所以,最有效率和最清晰的方法不是首先创build迭代器,而是使用迭代器的本地访问方法。