Самый чистый способ получить последний элемент из итератора Python
каков наилучший способ получить последний элемент из итератора в Python 2.6? Например, скажем
my_iter = iter(range(5))
каков самый короткий код / самый чистый способ получения 4 С my_iter?
Я мог бы сделать это, но это не кажется очень эффективным:
[x for x in my_iter][-1]
11 ответов:
использовать
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 поднимается
вот это
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]
вопрос неправильный и может привести только к ответу, который является сложным и неэффективным. Чтобы получить итератор, вы, конечно, начинаете с чего-то, что можно повторить, что в большинстве случаев будет предлагать более прямой способ доступа к последнему элементу.
Как только вы создаете итератор из iterable, вы застреваете в прохождении элементов, потому что это единственное, что обеспечивает iterable.
Итак, самый эффективный и понятный способ-это не создавать итератор в первую очередь, но использовать собственные методы доступа к iterable.
Comments