Как лучше всего получить последний элемент из итератора в Python 2.6? Например, скажите
my_iter = iter(range(5))
Какой самый короткий код / самый чистый способ получить 4
от my_iter
?
Я мог бы это сделать, но это кажется не очень эффективным:
[x for x in my_iter][-1]
iter(range(5))
Ответы:
источник
None
? Именно для этого и нужноNone
. Вы предполагаете, что какое-то значение по умолчанию для конкретной функции может быть правильным? Если итератор на самом деле не выполняет итерацию, то значение вне диапазона более значимо, чем какое-то вводящее в заблуждение значение по умолчанию для конкретной функции.None
значение по умолчанию, это ваш выбор. Ни один не всегда является наиболее разумным значением по умолчанию и может даже не выходить за рамки допустимого. Лично я предпочитаю использовать defaultvalue = object (), чтобы убедиться, что это действительно уникальное значение. Я просто указываю, что выбор значения по умолчанию выходит за рамки этого примера.None
окончательное значениеИспользуйте
deque
размер 1.источник
Если вы используете Python 3.x:
если вы используете python 2.7:
Примечание:
Обычно представленное выше решение - это то, что вам нужно для обычных случаев, но если вы имеете дело с большим объемом данных, более эффективно использовать
deque
размер 1. ( источник )источник
*lst, last = some_iterable
._
- это специальная переменная в python, которая используется либо для хранения последнего значения, либо для того, чтобы сказать, что меня не волнует значение, поэтому его можно очистить.Наверное стоит использовать,
__reversed__
если есть в наличииисточник
Так просто как:
источник
enumerate
возвращается(index, value)
как:(0, val0), (1, val1), (2, val2)
... а затем по умолчанию,max
когда задан список кортежей, сравнивается только с первым значением кортежа, если только два первых значения не равны, чего здесь никогда не бывает потому что они представляют собой индексы. Тогда конечный нижний индекс связан с тем, что max возвращает весь кортеж (idx, value), а нас интересует толькоvalue
. Интересная идея.Маловероятно, что это будет быстрее, чем пустой цикл for из-за лямбда, но, возможно, это даст кому-то идею
Если iter пуст, возникает ошибка TypeError
источник
TypeError
на пустой Iterable, вы можете также указать значение по умолчанию с помощью начального значенияreduce()
, например,last = lambda iterable, default=None: reduce(lambda _, x: x, iterable, default)
.Вот это
Если длина итерации действительно эпична - настолько велика, что материализация списка исчерпает память, - тогда вам действительно нужно переосмыслить дизайн.
источник
я хотел бы использовать
reversed
, за исключением того, что он принимает только последовательности вместо итераторов, что кажется довольно произвольным.Как бы то ни было, вам придется пройти через весь итератор. При максимальной эффективности, если итератор больше не понадобится, можно просто выбросить все значения:
Я считаю, что это неоптимальное решение.
источник
Библиотека toolz предлагает хорошее решение:
Но добавление неосновной зависимости может не стоить того, чтобы использовать ее только в этом случае.
источник
Смотрите этот код для чего-то похожего:
http://excamera.com/sphinx/article-islast.html
вы можете использовать его, чтобы забрать последний предмет:
источник
islast
в свой ответ (см. Meta.stackexchange.com/questions/8231/… ).Я бы просто использовал
next(reversed(myiter))
источник
Вопрос в том, чтобы получить последний элемент итератора, но если ваш итератор создается путем применения условий к последовательности, то обратное можно использовать для поиска «первого» в обратной последовательности, только глядя на необходимые элементы, применяя обратный к самой последовательности.
Надуманный пример,
источник
В качестве альтернативы для бесконечных итераторов вы можете использовать:
Я думал, что тогда будет медленнее,
deque
но так же быстро и на самом деле быстрее, чем для метода цикла (как-то)источник
Вопрос неправильный и может привести только к сложному и неэффективному ответу. Чтобы получить итератор, вы, конечно, начинаете с чего-то, что можно итерировать, что в большинстве случаев предлагает более прямой способ доступа к последнему элементу.
Как только вы создаете итератор из итерируемого объекта, вы застреваете в прохождении элементов, потому что это единственное, что предоставляет итератор.
Итак, наиболее эффективный и понятный способ - это не создавать итератор в первую очередь, а использовать собственные методы доступа к итератору.
источник