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