Pet*_*ter 102 python iterator python-2.7 python-3.x
在Python 2.6中从迭代器获取最后一项的最佳方法是什么?例如,说
my_iter = iter(range(5))
Run Code Online (Sandbox Code Playgroud)
什么是最短的代码/最干净的方式4来自my_iter?
我可以做到这一点,但它看起来效率不高:
[x for x in my_iter][-1]
Run Code Online (Sandbox Code Playgroud)
Tho*_*ers 90
item = defaultvalue
for item in my_iter:
pass
Run Code Online (Sandbox Code Playgroud)
小智 58
使用deque1号.
from collections import deque
#aa is an interator
aa = iter('apple')
dd = deque(aa, maxlen=1)
last_element = dd.pop()
Run Code Online (Sandbox Code Playgroud)
Dhi*_*aTN 55
如果您使用的是python 3.x:
*_, last = iterator # for a better understanding check PEP 448
print(last)
Run Code Online (Sandbox Code Playgroud)
如果您使用的是python 2.7:
last = next(iterator)
for last in iterator:
continue
print last
Run Code Online (Sandbox Code Playgroud)
注意:
通常上面提到的解决方案是常规案例所需的解决方案,但如果您处理大量数据,则使用deque大小为1 的解决方案效率更高.(来源)
from collections import deque
#aa is an interator
aa = iter('apple')
dd = deque(aa, maxlen=1)
last_element = dd.pop()
Run Code Online (Sandbox Code Playgroud)
Joh*_*ooy 32
__reversed__如果可用,可能值得使用
if hasattr(my_iter,'__reversed__'):
last = next(reversed(my_iter))
else:
for last in my_iter:
pass
Run Code Online (Sandbox Code Playgroud)
小智 25
很简单:
max(enumerate(the_iter))[1]
Run Code Online (Sandbox Code Playgroud)
Joh*_*ooy 19
由于lambda,这不太可能比空循环更快,但也许它会给别人一个想法
reduce(lambda x,y:y,my_iter)
Run Code Online (Sandbox Code Playgroud)
如果iter为空,则引发TypeError
就是这个
list( the_iter )[-1]
Run Code Online (Sandbox Code Playgroud)
如果迭代的长度真的是史诗般的 - 只要实现列表会耗尽内存 - 那么你真的需要重新考虑设计.
我将使用reversed,只是它只使用序列而不是迭代器,这似乎相当武断。
无论采用哪种方式,都必须遍历整个迭代器。以最高的效率,如果您不再需要迭代器,则可以废弃所有值:
for last in my_iter:
pass
# last is now the last item
Run Code Online (Sandbox Code Playgroud)
我认为这是次佳的解决方案。
| 归档时间: |
|
| 查看次数: |
41879 次 |
| 最近记录: |