Odpowiedzi:
some_list[-1]
jest najkrótszym i najbardziej pytonicznym.
W rzeczywistości możesz zrobić znacznie więcej dzięki tej składni. some_list[-n]
Składnia pobiera element uruchamiany n-tym ostatnim. Więc some_list[-1]
dostaje ostatni element, some_list[-2]
dostaje od drugiego do ostatniego itd., Aż do some_list[-len(some_list)]
, co daje pierwszy element.
W ten sposób można również ustawić elementy listy. Na przykład:
>>> some_list = [1, 2, 3]
>>> some_list[-1] = 5 # Set the last element
>>> some_list[-2] = 3 # Set the second to last element
>>> some_list
[1, 3, 5]
Zauważ, że uzyskanie elementu listy według indeksu spowoduje podniesienie, IndexError
jeśli oczekiwany element nie istnieje. Oznacza to, że some_list[-1]
zgłosi wyjątek, jeśli some_list
jest pusty, ponieważ pusta lista nie może zawierać ostatniego elementu.
Jeśli twoje str()
lub list()
obiekty mogą być puste jako takie: astr = ''
lub alist = []
, wtedy możesz chcieć użyć alist[-1:]
zamiast alist[-1]
dla „identyczności” obiektu.
Znaczenie tego jest następujące:
alist = []
alist[-1] # will generate an IndexError exception whereas
alist[-1:] # will return an empty list
astr = ''
astr[-1] # will generate an IndexError exception whereas
astr[-1:] # will return an empty str
Rozróżnia się tutaj to, że zwracanie pustego obiektu listy lub pustego obiektu str jest bardziej „ostatnim elementem” - bardziej niż obiektem wyjątku.
if len(my_vector) == 0 or my_vector[-1] != update_val
jest wykonalnym wzorcem. ale z pewnością nie jest to rozwiązanie globalne - fajnie byłoby mieć formę składni, w której żaden nie był wynikiem
xs[-1] if xs else None
Najprostszym sposobem wyświetlenia ostatniego elementu w pythonie jest
>>> list[-1:] # returns indexed value
[3]
>>> list[-1] # returns value
3
istnieje wiele innych metod osiągnięcia tego celu, ale są one krótkie i słodkie w użyciu.
list[-1]
wystąpi błąd.
a[-1:][0]
w ogóle ? On i a[-1]
tak zapewnia . Wyjaśnienie proszę?
Jak uzyskać w Pythonie ostatni element listy?
Aby zdobyć ostatni element,
przejdź -1
do notacji indeksu dolnego:
>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'
Indeksy i wycinki mogą przyjmować jako argumenty ujemne liczby całkowite.
Mam zmodyfikowany przykład z dokumentacji , aby wskazać, który element w sekwencji każdego indeksu odniesienia, w tym przypadku, w ciągu "Python"
, -1
odwołuje się do ostatniego elementu, postać, 'n'
:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5
-6 -5 -4 -3 -2 -1
>>> p = 'Python'
>>> p[-1]
'n'
Ta metoda może niepotrzebnie zmaterializować drugą listę w celu uzyskania ostatniego elementu, ale ze względu na kompletność (i ponieważ obsługuje każdą iterowalną - nie tylko listy):
>>> *head, last = a_list
>>> last
'three'
Nazwa zmiennej head jest powiązana z niepotrzebną nowo utworzoną listą:
>>> head
['zero', 'one', 'two']
Jeśli nie zamierzasz nic robić z tą listą, będzie to więcej apropos:
*_, last = a_list
Lub, naprawdę, jeśli wiesz, że jest to lista (lub przynajmniej akceptuje notację indeksu dolnego):
last = a_list[-1]
Komentator powiedział:
Chciałbym, żeby Python miał funkcję first () i last (), tak jak Lisp ... pozbyłby się wielu niepotrzebnych funkcji lambda.
Można by je dość łatwo zdefiniować:
def last(a_list):
return a_list[-1]
def first(a_list):
return a_list[0]
Lub użyj operator.itemgetter
:
>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)
W obu przypadkach:
>>> last(a_list)
'three'
>>> first(a_list)
'zero'
Jeśli robisz coś bardziej skomplikowanego, może okazać się, że bardziej wydajne jest uzyskanie ostatniego elementu na nieco inne sposoby.
Jeśli dopiero zaczynasz programować, powinieneś unikać tej sekcji, ponieważ łączy ona semantycznie różne części algorytmów razem. Zmiana algorytmu w jednym miejscu może mieć niezamierzony wpływ na inną linię kodu.
Staram się zapewnić zastrzeżenia i warunki tak dokładnie, jak potrafię, ale być może coś mi umknęło. Proszę o komentarz, jeśli uważasz, że zostawiam zastrzeżenie.
Fragment listy zwraca nową listę - dzięki czemu możemy wyciąć od -1 do końca, jeśli chcemy, aby element był na nowej liście:
>>> a_slice = a_list[-1:]
>>> a_slice
['three']
Ma to tę zaletę, że nie zawiedzie, jeśli lista jest pusta:
>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
... do_something(tail)
Podczas gdy próba dostępu za pomocą indeksu rodzi problem, z IndexError
którym należałoby się uporać:
>>> empty_list[-1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Ale ponownie, krojenie w tym celu powinno być wykonane tylko wtedy, gdy potrzebujesz:
for
pętleW Pythonie nie ma wewnętrznego zakresu w for
pętli.
Jeśli wykonujesz już pełną iterację na liście, do ostatniego elementu nadal będzie odwoływać się nazwa zmiennej przypisana w pętli:
>>> def do_something(arg): pass
>>> for item in a_list:
... do_something(item)
...
>>> item
'three'
To nie jest semantycznie ostatnia rzecz na liście. Jest to semantycznie ostatnia rzecz, z którą nazwa item
była związana.
>>> def do_something(arg): raise Exception
>>> for item in a_list:
... do_something(item)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 1, in do_something
Exception
>>> item
'zero'
Dlatego należy tego użyć tylko do uzyskania ostatniego elementu
Możemy również mutować naszą oryginalną listę, usuwając i zwracając ostatni element:
>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']
Ale teraz oryginalna lista została zmodyfikowana.
(w -1
rzeczywistości jest domyślnym argumentem, więc list.pop
można go używać bez argumentu indeksu):
>>> a_list.pop()
'two'
Zrób to tylko, jeśli
Są to ważne przypadki użycia, ale niezbyt częste.
Nie wiem, dlaczego to zrobiłeś, ale dla kompletności, ponieważ reversed
zwraca iterator (który obsługuje protokół iteratora), możesz przekazać jego wynik do next
:
>>> next(reversed([1,2,3]))
3
To jest jak odwrócenie tego:
>>> next(iter([1,2,3]))
1
Ale nie mogę wymyślić dobrego powodu, aby to zrobić, chyba że później będziesz potrzebować reszty odwrotnego iteratora, który prawdopodobnie wyglądałby bardziej tak:
reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)
use_later = list(reverse_iterator)
i teraz:
>>> use_later
[2, 1]
>>> last_element
3
Aby temu zapobiec IndexError: list index out of range
, użyj tej składni:
mylist = [1, 2, 3, 4]
# With None as default value:
value = mylist and mylist[-1]
# With specified default value (option 1):
value = mylist and mylist[-1] or 'default'
# With specified default value (option 2):
value = mylist[-1] if mylist else 'default'
Inna metoda:
some_list.reverse()
some_list[0]
lst[-1]
jest najlepszym podejściem, ale przy ogólnych iteracjach rozważ more_itertools.last
:
Kod
import more_itertools as mit
mit.last([0, 1, 2, 3])
# 3
mit.last(iter([1, 2, 3]))
# 3
mit.last([], "some default")
# 'some default'
list[-1]
pobierze ostatni element listy bez zmiany listy.
list.pop()
pobierze ostatni element listy, ale zmutuje / zmieni oryginalną listę. Zwykle mutowanie oryginalnej listy nie jest zalecane.
Alternatywnie, jeśli z jakiegoś powodu szukasz czegoś mniej pytonicznego, możesz użyć list[len(list)-1]
, zakładając, że lista nie jest pusta.
Możesz również użyć poniższego kodu, jeśli nie chcesz otrzymywać IndexError, gdy lista jest pusta.
next(reversed(some_list), None)
Ok, ale co z pospolitym w prawie każdym języku items[len(items) - 1]
? Jest to IMO najłatwiejszy sposób na uzyskanie ostatniego elementu, ponieważ nie wymaga on żadnej wiedzy pythońskiej .
some_list[-1]
podejście, ponieważ jest bardziej logiczne i pokazuje, co tak naprawdę robi lepiej niż some_list[-1]
moim zdaniem.
some_list.last
- to byłaby piękna linia kodu