从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迭代器,而是使用迭代器的本地访问方法。