从 Python 迭代器获取最后一项的最简洁方法
- 2025-03-05 09:17:00
- admin 原创
- 6
问题描述:
在 Python 2.6 中,从迭代器中获取最后一个项的最佳方法是什么?例如,
my_iter = iter(range(5))
4
从获得的最短代码/最干净的方法是什么my_iter
?
我可以这样做,但似乎效率不高:
[x for x in my_iter][-1]
解决方案 1:
如果你使用的是 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()
解决方案 2:
item = defaultvalue
for item in my_iter:
pass
解决方案 3:
使用deque
大小为 1 的 a。
from collections import deque
# aa is an iterator
aa = iter('apple')
dd = deque(aa, maxlen=1)
last_element = dd.pop()
简短版本:
last_element, = deque(aa, 1)
解决方案 4:
__reversed__
如果有的话可能值得使用
if hasattr(my_iter,'__reversed__'):
last = next(reversed(my_iter))
else:
for last in my_iter:
pass
解决方案 5:
简单来说:
max(enumerate(the_iter))[1]
解决方案 6:
由于 lambda,这不太可能比空 for 循环更快,但也许它会给其他人一个想法
reduce(lambda x,y:y,my_iter)
如果 iter 为空,则会引发 TypeError
解决方案 7:
这是
list( the_iter )[-1]
如果迭代的长度确实很长(长到实现列表会耗尽内存),那么您确实需要重新考虑设计。
解决方案 8:
我会使用reversed
,除了它只需要序列而不是迭代器,这似乎相当随意。
不管怎样,你都必须遍历整个迭代器。在最高效率下,如果你不再需要迭代器,你可以丢弃所有值:
for last in my_iter:
pass
# last is now the last item
不过,我认为这是一个次优的解决方案。
解决方案 9:
toolz库提供了一个很好的解决方案:
from toolz.itertoolz import last
last(values)
但在这种情况下添加非核心依赖项可能不值得使用。
解决方案 10:
您可以使用这个出色的more_itertools
库和last(iterable[, default])
函数:
more_itertools.last(iterable[, default])
[来源]返回iterable的最后一项,如果iterable为空,则返回默认。
>>> last([0, 1, 2, 3]) 3 >>> last([], 'some default') 'some default'
如果未提供默认值并且可迭代对象中没有项目,则引发
ValueError
。
它结合了deque
这里的一些答案提出的方法,并进行了一些额外的改进(详情请参阅来源)。
解决方案 11:
请参阅此代码以了解类似内容:
http://excamera.com/sphinx/article-islast.html
你可以使用它来拾取最后一个项目:
[(last, e) for (last, e) in islast(the_iter) if last]
解决方案 12:
我只会用next(reversed(myiter))
解决方案 13:
问题是关于获取迭代器的最后一个元素,但是如果您的迭代器是通过将条件应用于序列而创建的,则可以使用 reversed 来找到反向序列的“第一个”,只查看所需的元素,通过将反向应用于序列本身。
举个例子,
>>> seq = list(range(10))
>>> last_even = next(_ for _ in reversed(seq) if _ % 2 == 0)
>>> last_even
8
解决方案 14:
这个问题是错误的,只能导致复杂且低效的答案。要获得迭代器,您当然要从可迭代的东西开始,在大多数情况下,这将提供更直接的方式来访问最后一个元素。
一旦你从可迭代对象创建迭代器,你就只能遍历元素,因为这是可迭代对象提供的唯一东西。
因此,最有效和最清晰的方法不是首先创建迭代器,而是使用可迭代对象的本机访问方法。
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)