Jaki jest najlepszy sposób na uzyskanie ostatniego elementu z iteratora w Pythonie 2.6? Na przykład powiedz
my_iter = iter(range(5))
Jaka jest najkrótsza-code / najczystszym sposobem na uzyskanie 4
od my_iter
?
Mógłbym to zrobić, ale nie wydaje się to zbyt wydajne:
[x for x in my_iter][-1]
python
python-3.x
python-2.7
iterator
Piotr
źródło
źródło
iter(range(5))
Odpowiedzi:
źródło
None
? Właśnie po toNone
jest. Czy sugerujesz, że niektóre wartości domyślne specyficzne dla funkcji mogą być nawet poprawne? Jeśli iterator w rzeczywistości nie iteruje, to wartość poza pasmem jest bardziej znacząca niż jakaś myląca wartość domyślna specyficzna dla funkcji.None
wartości domyślnej, to Twój wybór. Brak nie zawsze jest najbardziej rozsądną wartością domyślną i może nawet nie być poza pasmem. Osobiście używam „defaultvalue = object ()”, aby upewnić się, że jest to naprawdę wyjątkowa wartość. Wskazuję tylko, że wybór wartości domyślnej jest poza zakresem tego przykładu.None
ostateczną wartośćUżyj
deque
rozmiaru 1.źródło
Jeśli używasz Pythona 3.x:
jeśli używasz Pythona 2.7:
Dygresja:
Zwykle rozwiązanie przedstawione powyżej jest tym, czego potrzebujesz w zwykłych przypadkach, ale jeśli masz do czynienia z dużą ilością danych, bardziej wydajne jest użycie
deque
rozmiaru 1. ( źródło )źródło
*lst, last = some_iterable
._
to specjalna zmienna w Pythonie, używana albo do przechowywania ostatniej wartości, albo do stwierdzenia, że nie obchodzi mnie wartość, więc można ją wyczyścić.Prawdopodobnie warto go użyć,
__reversed__
jeśli jest dostępnyźródło
Tak prosty jak:
źródło
enumerate
zwraca(index, value)
takie jak:(0, val0), (1, val1), (2, val2)
... a następnie domyślnie,max
gdy otrzyma listę krotek, porównuje tylko z pierwszą wartością krotki, chyba że dwie pierwsze wartości są równe, których nigdy tutaj nie ma ponieważ reprezentują indeksy. W takim przypadku końcowy indeks dolny jest taki, że max zwraca całą (idx, wartość) krotkę, podczas gdy jesteśmy tylko zainteresowanivalue
. Ciekawy pomysł.Jest mało prawdopodobne, aby było to szybsze niż pusta pętla for ze względu na lambdę, ale może da pomysł komuś innemu
Jeśli iter jest pusty, zostanie zgłoszony TypeError
źródło
TypeError
dla pustej iterowalnej, możesz również podać wartość domyślną poprzez wartość początkowąreduce()
, nplast = lambda iterable, default=None: reduce(lambda _, x: x, iterable, default)
.Jest to
Jeśli długość iteracji jest naprawdę epicka - tak długa, że zmaterializowanie listy wyczerpuje pamięć - wtedy naprawdę musisz przemyśleć projekt.
źródło
Chciałbym użyć
reversed
, z wyjątkiem tego, że przyjmuje tylko sekwencje zamiast iteratorów, co wydaje się raczej arbitralne.Jakkolwiek to zrobisz, będziesz musiał przejść przez cały iterator. Przy maksymalnej wydajności, jeśli nie będziesz już potrzebować iteratora, możesz po prostu usunąć wszystkie wartości:
Myślę jednak, że jest to nieoptymalne rozwiązanie.
źródło
Toolz biblioteka zapewnia miły rozwiązanie:
Ale dodanie innej zależności może nie być tego warte, ponieważ używa jej tylko w tym przypadku.
źródło
Zobacz ten kod dla czegoś podobnego:
http://excamera.com/sphinx/article-islast.html
możesz go użyć do odebrania ostatniego przedmiotu z:
źródło
islast
W odpowiedzi podaj kod (patrz: meta.stackexchange.com/questions/8231/… ).Po prostu użyłbym
next(reversed(myiter))
źródło
Pytanie dotyczy uzyskania ostatniego elementu iteratora, ale jeśli twój iterator jest tworzony przez zastosowanie warunków do sekwencji, to odwrócenie może być użyte do znalezienia "pierwszego" odwróconej sekwencji, patrząc tylko na potrzebne elementy, stosując odwrócić do samej sekwencji.
Wymyślony przykład,
źródło
Alternatywnie dla nieskończonych iteratorów możesz użyć:
Myślałem, że wtedy będzie wolniej,
deque
ale jest tak samo szybki i faktycznie szybszy niż dla metody pętli (jakoś)źródło
Pytanie jest błędne i może prowadzić tylko do skomplikowanej i nieskutecznej odpowiedzi. Aby otrzymać iterator, oczywiście zaczynasz od czegoś, co jest iterowalne, co w większości przypadków oferuje bardziej bezpośredni sposób dostępu do ostatniego elementu.
Po utworzeniu iteratora z iterowalnego utkniesz w przejściu przez elementy, ponieważ jest to jedyna rzecz, jaką zapewnia iteracja.
Zatem najbardziej wydajnym i przejrzystym sposobem nie jest utworzenie iteratora w pierwszej kolejności, ale użycie natywnych metod dostępu iterowalnego.
źródło