从 Python 迭代器获取最后一项的最简洁方法

2025-03-05 09:17:00
admin
原创
4
摘要:问题描述:在 Python 2.6 中,从迭代器中获取最后一个项的最佳方法是什么?例如,my_iter = iter(range(5)) 4从获得的最短代码/最干净的方法是什么my_iter?我可以这样做,但似乎效率不高:[x for x in my_iter][-1] 解决方案 1:如果你使用的是 Pyth...

问题描述:

在 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:

这个问题是错误的,只能导致复杂且低效的答案。要获得迭代器,您当然要从可迭代的东西开始,在大多数情况下,这将提供更直接的方式来访问最后一个元素。

一旦你从可迭代对象创建迭代器,你就只能遍历元素,因为这是可迭代对象提供的唯一东西。

因此,最有效和最清晰的方法不是首先创建迭代器,而是使用可迭代对象的本机访问方法。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用