从 Python 迭代器获取最后一项的最简洁方法
-
22-09-2019 - |
题
在 Python 2.6 中从迭代器获取最后一项的最佳方法是什么?例如,说
my_iter = iter(range(5))
最短的代码/最干净的获取方式是什么 4
从 my_iter
?
我可以这样做,但它似乎不是很有效:
[x for x in my_iter][-1]
解决方案
item = defaultvalue
for item in my_iter:
pass
其他提示
使用一个 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
注意:
通常,上面提供的解决方案是您在常规情况下所需的解决方案,但如果您正在处理大量数据,那么使用 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]
这是不太可能比空的for循环更快,因为拉姆达,但也许它会给别人一个想法
reduce(lambda x,y:y,my_iter)
如果该ITER是空的,一个TypeError升高
有用户使用这是
list( the_iter )[-1]
如果迭代的长度是真正的史诗 - 这么久,物化列表将耗尽内存 - 那么你真的需要重新思考设计
我会用reversed
,不同之处在于只需要代替迭代序列,这似乎相当武断的。
你做的任何方式,你必须在整个迭代器运行。在最高的效率,如果你不需要迭代以后再,你可以只垃圾桶中的所有值:
for last in my_iter:
pass
# last is now the last item
我认为这是次优的解决方案,但
请参阅类似的东西此代码:
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
但它是作为快速和它实际上是更快然后for循环方法(以某种方式)
的问题是错误的,并且只能导致答案是复杂和低效的。 为了得到一个迭代器,你当然从东西是可迭代的,这将在大多数情况下提供访问的最后一个元素的更直接的方式开始了。
一旦从一个可迭代创建一个迭代你被卡住在通过元件去,因为这是唯一一个可迭代提供。
因此,最有效和明确的方式不是要建立在首位的迭代器,但使用迭代的本地接入方式。