Самый чистый способ получить последний элемент из итератора Python



каков наилучший способ получить последний элемент из итератора в Python 2.6? Например, скажем



my_iter = iter(range(5))


каков самый короткий код / самый чистый способ получения 4 С my_iter?



Я мог бы сделать это, но это не кажется очень эффективным:



[x for x in my_iter][-1]
547   11  

11 ответов:

item = defaultvalue
for item in my_iter:
    pass

использовать deque размером 1.

from collections import deque

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

dd = deque(aa, maxlen=1)
last_element = dd.pop()

наверное стоит использовать __reversed__ если он доступен

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

Если вы используете 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

это вряд ли будет быстрее, чем пустой цикл for из-за лямбды, но, возможно, это даст кому-то еще идею

reduce(lambda x,y:y,my_iter)

Если iter пуст, TypeError поднимается

просто:

max(enumerate(the_iter))[1]

вот это

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]

Я бы просто использовать next(reversed(myiter))

вопрос неправильный и может привести только к ответу, который является сложным и неэффективным. Чтобы получить итератор, вы, конечно, начинаете с чего-то, что можно повторить, что в большинстве случаев будет предлагать более прямой способ доступа к последнему элементу.

Как только вы создаете итератор из iterable, вы застреваете в прохождении элементов, потому что это единственное, что обеспечивает iterable.

Итак, самый эффективный и понятный способ-это не создавать итератор в первую очередь, но использовать собственные методы доступа к iterable.

Comments

    Ничего не найдено.