从Python 2.6的迭代器中获取最后一项的最佳方法是什么?例如说
my_iter = iter(range(5))
什么是获得的最短码/干净的方式4
从my_iter
?
我可以做到这一点,但效率似乎并不高:
[x for x in my_iter][-1]
iter(range(5))
从Python 2.6的迭代器中获取最后一项的最佳方法是什么?例如说
my_iter = iter(range(5))
什么是获得的最短码/干净的方式4
从my_iter
?
我可以做到这一点,但效率似乎并不高:
[x for x in my_iter][-1]
iter(range(5))
Answers:
item = defaultvalue
for item in my_iter:
pass
None
呢?这正是None
目的。您是否建议某些特定于功能的默认值甚至是正确的?如果迭代器实际上没有进行迭代,则带外值比某些误导功能的默认值更有意义。
None
用作默认值,则由您选择。没有一个并不总是最明智的默认值,甚至可能没有超出范围。我个人倾向于使用“ defaultvalue = object()”来确保它是一个真正唯一的值。我只是表示默认的选择超出了本示例的范围。
None
最终值的迭代器之间的区别也许很有用
使用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()
*lst, last = some_iterable
。
_
是python中的特殊变量,用于存储最后一个值,或者说我不在乎该值,因此可以清除。
有这个
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]
islast
在答案中包含的代码(请参见meta.stackexchange.com/questions/8231/…)。
这个问题是错误的,只能导致复杂而低效的答案。要获得迭代器,您当然要从可迭代的事物开始,这在大多数情况下将提供访问最后一个元素的更直接的方法。
从可迭代对象创建迭代器后,您就不得不遍历元素,因为这是可迭代对象唯一提供的内容。
因此,最有效,最清晰的方法不是首先创建迭代器,而是使用迭代器的本机访问方法。