繁体   English   中英

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

[英]Cleanest way to get last item from Python iterator

从 Python 2.6 中的迭代器获取最后一项的最佳方法是什么? 例如,说

my_iter = iter(range(5))

my_iter获得4的最短代码/最干净的方法是什么?

我可以这样做,但它似乎不是很有效:

[x for x in my_iter][-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


边注:

通常,上面介绍的解决方案是您在常规情况下所需要的,但如果您正在处理大量数据,使用大小为 1 的deque更有效。(来源

from collections import deque

#aa is an interator
aa = iter('apple')

dd = deque(aa, maxlen=1)
last_element = dd.pop()
item = defaultvalue
for item in my_iter:
    pass

使用大小为 1 的deque

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)

如果__reversed__可用,可能值得使用

if hasattr(my_iter,'__reversed__'):
    last = next(reversed(my_iter))
else:
    for last in my_iter:
        pass

很简单:

max(enumerate(the_iter))[1]

由于 lambda,这不太可能比空的 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

不过,我认为这是一个次优的解决方案。

toolz库提供了一个很好的解决方案:

from toolz.itertoolz import last
last(values)

但是仅在这种情况下使用它可能不值得添加非核心依赖项。

有关类似内容,请参阅此代码:

http://excamera.com/sphinx/article-islast.html

你可以用它来拿起最后一个项目:

[(last, e) for (last, e) in islast(the_iter) if last]

问题是关于获取迭代器的最后一个元素,但是如果您的迭代器是通过将条件应用于序列来创建的,那么 reversed 可用于查找反向序列的“第一个”,只需查看所需的元素,通过应用与序列本身相反。

一个人为的例子,

>>> seq = list(range(10))
>>> last_even = next(_ for _ in reversed(seq) if _ % 2 == 0)
>>> last_even
8

我只会使用next(reversed(myiter))

或者,对于无限迭代器,您可以使用:

from itertools import islice 
last = list(islice(iterator(), 1000))[-1] # where 1000 is number of samples 

我认为它会比deque慢,但它同样快,实际上比 for 循环方法更快(不知何故)

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

一旦你从一个可迭代对象创建了一个迭代器,你就会被困在遍历元素的过程中,因为这是可迭代对象提供的唯一东西。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM