Jak zdobyć ostatni element listy?

Jak w Pythonie uzyskać ostatni element listy?


person Janusz    schedule 30.05.2009    source źródło


Odpowiedzi (18)


some_list[-1] jest najkrótszym i najbardziej Pythonicznym.

W rzeczywistości dzięki tej składni możesz zrobić znacznie więcej. Składnia some_list[-n] pobiera element od n-tego do ostatniego. Zatem some_list[-1] pobiera ostatni element, some_list[-2] pobiera przedostatni element itd. aż do some_list[-len(some_list)], co daje pierwszy element.

W ten sposób możesz także 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]

Pamiętaj, że pobranie elementu listy według indeksu spowoduje wyświetlenie 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.

person Sasha Chedygov    schedule 30.05.2009
comment
Brakuje mi czegoś takiego jak some_list.last - byłaby to piękna linia kodu - person Dmitry P.; 20.01.2020

Jeśli Twoje obiekty str() lub list() mogą okazać się puste: astr = '' lub alist = [], możesz użyć alist[-1:] zamiast alist[-1] dla obiektu „identyczność”.

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ę, że zwrócenie pustego obiektu listy lub pustego obiektu str jest bardziej „ostatnim elementem” niż obiektem wyjątku.

person DevPlayer    schedule 09.11.2010
comment
Odrzucono, ponieważ uważam, że sedno tej odpowiedzi jest niepoprawne. Pobranie listy, gdy potrzebujesz elementu, jedynie opóźnia nieunikniony indeks listy poza zakres - i to właśnie powinno się zdarzyć, gdy próbujesz pobrać element z pustej listy. W przypadku ciągów astr[-1:] może być poprawnym podejściem, ponieważ zwraca ten sam typ co astr[-1], ale nie sądzę, że „:” pomaga radzić sobie z pustymi listami (a pytanie dotyczy list) . Jeśli pomysł polega na użyciu alist[-1:] jako warunku zamiast len(alist) > 0, myślę, że znacznie czytelniejsze będzie użycie późniejszej opcji. (chętnie zagłosuję, jeśli coś przeoczyłem) - person Stan Kurdziel; 07.06.2015
comment
Twój głos w sprawie sprzeciwu jest zrozumiały i ważny. Uważam jednak, że istnieją dwa podstawowe obozy dotyczące tego, do czego przeznaczone są obiekty wyjątków. Jedno jest pewne: wyjątki zatrzymują aplikację. Jeden obóz używa wyjątków w klauzulach try, podczas gdy drugi obóz zamiast tego użyłby struktury if len(alist)›0:. W każdym razie wyjątki to obiekty, które zatrzymują Twój kod. I dlatego dla mnie jest mniej obiektów sekwencji, takich jak zwracane sekwencje zerowe, które nie zatrzymują twojego kodu. Preferuję używanie klauzul IF do testowania obiektów o wartości null zamiast obiektów, które zatrzymują mój kod, który wywłaszczam za pomocą klauzuli try. - person DevPlayer; 08.06.2015
comment
Przegłosowano, ponieważ składnia plasterków jest warta dyskusji, jednak zgadzam się z @StanKurdziel, że morfologia jest błędna, po prostu przesuwasz słupek bramki - odkryłem, że moje własne rozwiązanie było związane z podstawowym użyciem „dodaj to do listy, jeśli tego nie zrobiłeś” „jeszcze tego nie dodałem” (wykresy liniowe delta), więc połączone wyrażenie if len(my_vector) == 0 or my_vector[-1] != update_val jest wykonalnym wzorcem. ale z pewnością nie jest to rozwiązanie globalne - byłoby miło mieć formę składni, w której wynikiem byłoby None - person Mark Mullin; 05.03.2017
comment
Dlaczego miałbyś unikać IndexError? Jeśli spróbujesz zaindeksować pustą listę lub ciąg, otrzymasz wyjątek. Jeśli chcesz obsłużyć ten wyjątek, użyj try/except - po to właśnie jest. - person Chris Johnson; 01.08.2018

Możesz także zrobić:

last_elem = alist.pop()

Zależy to od tego, co chcesz zrobić ze swoją listą, ponieważ metoda pop() usunie ostatni element.

person Taurus Olson    schedule 30.05.2009

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 takiego celu, ale są one krótkie i łatwe w użyciu.

person Atul Arvind    schedule 20.08.2012
comment
jeśli długość listy wynosi zero, to rozwiązanie działa, gdy list[-1] spowoduje błąd. - person anon01; 15.02.2018

Jak w Pythonie uzyskać ostatni element listy?

Aby zdobyć ostatni element,

  • bez modyfikowania listy oraz
  • zakładając, że wiesz, że lista zawiera ostatni element (tj. jest niepusta)

przekazać -1 do notacji z indeksem dolnym:

>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'

Wyjaśnienie

Indeksy i wycinki mogą przyjmować jako argumenty ujemne liczby całkowite.

Zmodyfikowałem przykład z dokumentacji, aby wskazać, który element w sekwencji każdy indeks odniesienia, w tym przypadku, w ciągu "Python", -1 odwołują się do ostatniego elementu, znaku, 'n':

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
   0   1   2   3   4   5 
  -6  -5  -4  -3  -2  -1

>>> p = 'Python'
>>> p[-1]
'n'

Przypisanie poprzez iterowalne rozpakowywanie

Ta metoda może niepotrzebnie zmaterializować drugą listę w celu uzyskania ostatniego elementu, ale ze względu na kompletność (i ponieważ obsługuje dowolną iterowalność - 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ą, bardziej pasowałoby to:

*_, last = a_list

Lub, naprawdę, jeśli wiesz, że to lista (lub przynajmniej akceptuje notację z indeksem dolnym):

last = a_list[-1]

W funkcji

Komentator powiedział:

Chciałbym, żeby Python miał funkcję First() i Last(), tak jak Lisp... pozbyłby się wielu niepotrzebnych funkcji lambda.

Zdefiniowanie ich byłoby dość proste:

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'

Specjalne przypadki

Jeśli robisz coś bardziej skomplikowanego, bardziej wydajne może być uzyskanie ostatniego elementu w nieco inny sposób.

Jeśli dopiero zaczynasz programować, powinieneś ominąć tę sekcję, ponieważ łączy ona semantycznie różne części algorytmów. Jeśli zmienisz algorytm w jednym miejscu, może to mieć niezamierzony wpływ na inną linię kodu.

Staram się podać zastrzeżenia i warunki tak szczegółowo, jak to możliwe, ale mogłem coś przeoczyć. Proszę o komentarz, jeśli uważasz, że pomijam zastrzeżenie.

Krajanie na plastry

Wycinek listy zwraca nową listę, więc możemy wyciąć od -1 do końca, jeśli chcemy, aby element znalazł się na nowej liście:

>>> a_slice = a_list[-1:]
>>> a_slice
['three']

Ma to tę zaletę, że nie zawodzi, jeśli lista jest pusta:

>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
...     do_something(tail)

Podczas gdy próba dostępu przez indeks wywołuje IndexError, który należy obsłużyć:

>>> empty_list[-1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Ale znowu, krojenie w tym celu powinno odbywać się tylko wtedy, gdy potrzebujesz:

  • utworzono nową listę
  • a nowa lista będzie pusta, jeśli poprzednia lista była pusta.

for pętli

Cechą Pythona jest to, że w pętli for nie ma wewnętrznego zakresu.

Jeśli wykonujesz już pełną iterację na liście, do ostatniego elementu nadal będzie odwoływała 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ą związana była nazwa item.

>>> 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żywać tylko do uzyskania ostatniego elementu, jeśli ty

  • już zapętlają się i
  • wiesz, że pętla się zakończy (nie zostanie przerwana ani nie zakończy się z powodu błędów), w przeciwnym razie wskaże ostatni element, do którego odwołuje się pętla.

Pobieranie i usuwanie

Możemy również zmutować 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.

(-1 jest w rzeczywistości argumentem domyślnym, więc list.pop można użyć bez argumentu indeksu):

>>> a_list.pop()
'two'

Zrób to tylko wtedy, gdy

  • wiesz, że lista zawiera elementy lub jesteś przygotowany na obsługę wyjątku, jeśli jest pusty, oraz
  • zamierzasz usunąć ostatni element z listy, traktując go jak stos.

Są to prawidłowe przypadki użycia, ale niezbyt częste.

Resztę rewersu zostawiam na później:

Nie wiem, dlaczego miałbyś to zrobić, 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 jakby zrobić odwrotność tego:

>>> next(iter([1,2,3]))
1

Ale nie mogę wymyślić dobrego powodu, aby to zrobić, chyba że będziesz potrzebować później reszty iteratora odwrotnego, 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
person Aaron Hall    schedule 23.06.2017

Aby 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'
person Valentin Podkamennyi    schedule 13.04.2019


Inna metoda:

some_list.reverse() 
some_list[0]
person Sanjay Pradeep    schedule 10.01.2016
comment
Jest to prosta metoda, w której możesz wykonać tę samą operację również na O(n), nawet jeśli masz taką możliwość w O(1). - person say_my_name; 08.06.2021

list[-1] pobierze ostatni element listy bez zmiany listy. list.pop() pobierze ostatni element listy, ale zmutuje/zmieni oryginalną listę. Zwykle nie zaleca się mutowania oryginalnej listy.

Alternatywnie, jeśli z jakiegoś powodu szukasz czegoś mniej Pythonicznego, możesz użyć list[len(list)-1], zakładając, że lista nie jest pusta.

person Sondering Narcissist    schedule 07.10.2016
comment
Chyba błędne jest założenie, że mutowanie oryginalnej listy zwykle nie jest zalecane, bo przecież jest to bardzo często wykonywane - person Aaron; 01.12.2016

Możesz także użyć poniższego kodu, jeśli nie chcesz uzyskać IndexError, gdy lista jest pusta.

next(reversed(some_list), None)
person Yavuz Mester    schedule 02.06.2017

OK, ale co z powszechnym w prawie każdym języku items[len(items) - 1]? Jest to IMO najłatwiejszy sposób na uzyskanie ostatniego elementu, ponieważ nie wymaga żadnej wiedzy pythonicznej.

person Radek Anuszewski    schedule 07.10.2015
comment
items[len(items) - 1] to zasadniczo to, co Python robi pod maską, ale ponieważ długość sekwencji jest już zapisana w sekwencji, nie ma potrzeby jej zliczania, tworzysz więcej pracy, niż jest to konieczne. - person Dan Gayle; 10.10.2015
comment
skoro piszesz w Pythonie, naprawdę powinieneś spróbować być bardziej Pythoniczny - person Michael Wu; 27.10.2015
comment
@MichaelWu Nie ma sensu tego robić. Sposób Pythona często nie jest oczywisty, wymaga większej uwagi, gdy trzeba wprowadzić nowe osoby do projektu i oczywiście nie zadziała, gdy trzeba przełączyć się na inne języki, takie jak Java - nie można używać wiedzy specyficznej dla Pythona. Jeśli pominiesz sposób Pythona, jak to możliwe, powrót do projektu po miesiącach/latach będzie znacznie łatwiejszy. - person Radek Anuszewski; 31.10.2015
comment
@Pneumokok Masz rację, ale twierdzę, że indeksowanie list jest bardzo podstawową techniką Pythona w porównaniu do powiedzmy generatorów. Poza tym po co zawracać sobie głowę używaniem czegokolwiek innego niż C lub może JavaScript, jeśli nie zamierzasz korzystać z indywidualnych narzędzi językowych i składni? Wtedy będziesz mógł konsekwentnie robić wszystko, co w jego mocy, we wszystkich swoich projektach. - person Matthew Purdon; 03.12.2015
comment
Chociaż nie jest to zbyt Pythoniczne, myślę, że jest to pod pewnymi względami lepsze niż podejście some_list[-1], ponieważ jest bardziej logiczne i moim zdaniem pokazuje, co faktycznie robi lepiej niż some_list[-1]. - person Byron Filer; 05.11.2016
comment
Co się stanie za my_test = [] last_item = my_test[len(my_test) - 1]. Spowoduje to również zgłoszenie wyjątku dla IndexError, podobnie jak inne odpowiedzi. Chociaż uważam, że wyjątki są uzasadnione i dobre, ponieważ wiem, co zrobić z moim preferowanym try:...except:...else:...finally:... wzorcem kodowania w Pythonie. - person Fr0zenFyr; 14.04.2018

Sposób Pythoniczny

Rozważmy więc, że mamy listę a = [1,2,3,4], w Pythonie można manipulować listą, aby dać nam jej część lub element, za pomocą następującego polecenia można łatwo uzyskać ostatni element.

print(a[-1])
person Muneeb Ahmad Khurram    schedule 09.05.2021

Oto rozwiązanie Twojego zapytania.

a=["first","middle","last"] # A sample list
print(a[0]) #prints the first item in the list because the index of the list always starts from 0.
print(a[-1]) #prints the last item in the list.
print(a[-2]) #prints the last second item in the list.

Wyjście:

>>> first
>>> last
>>> middle
person Code Carbonate    schedule 03.07.2020

Aby uniknąć IndexError: lista indeksu poza zakresem, możesz użyć tego fragmentu kodu.

list_values = [12, 112, 443]

def getLastElement(lst):
    if len(lst) == 0:
        return 0
    else:
        return lst[-1]

print(getLastElement(list_values))
person HASAN HÜSEYİN YÜCEL    schedule 23.03.2021
comment
Problem z tym rozwiązaniem polega na tym, że w przypadku len(lst) == 0 zwróci ciąg znaków, gdy czekasz na liczbę typu int. - person raulmd13; 29.03.2021
comment
Naprawił.......... - person HASAN HÜSEYİN YÜCEL; 29.03.2021
comment
Chciałem powiedzieć, że ta metoda działa z danym typem danych. Nie można jej używać do wszystkich typów list. Ale nie jest to zła odpowiedź. - person raulmd13; 30.03.2021

Będziesz musiał po prostu wziąć i umieścić indeks [-1]. Na przykład:

list=[0,1,2]
last_index=list[-1]
print(last_index)

Otrzymasz 2 jako wynik.

person AI Nerd    schedule 07.05.2021

Dostęp do ostatniego elementu z listy w Pythonie:

1: Uzyskaj dostęp do ostatniego elementu z ujemnym indeksowaniem -1

>> data = ['s','t','a','c','k','o','v','e','r','f','l','o','w']
>> data[-1]
'w'

2. Uzyskaj dostęp do ostatniego elementu metodą pop()

>> data = ['s','t','a','c','k','o','v','e','r','f','l','o','w']
>> data.pop()
'w'

Jednak metoda pop usunie ostatni element z listy.

person Gunjan    schedule 04.06.2021
comment
Chociaż to prawda, .pop jest destrukcyjny (jak wyjaśniono w innych odpowiedziach). Nie tylko pobiera ostatnią pozycję z listy, ale także ją usuwa z listy - person Wondercricket; 08.06.2021

Jeśli to zrobisz my_list[-1], zwróci ostatni element listy. Indeksy sekwencji ujemnej reprezentują pozycje od końca tablicy. Indeksowanie ujemne oznacza rozpoczynanie od końca, -1 odnosi się do ostatniego elementu, -2 odnosi się do przedostatniego elementu itd.

person Hadi Mir    schedule 26.12.2020

Nie udało się znaleźć żadnej odpowiedzi, która by o tym wspominała. Więc dodaję.

Możesz także spróbować some_list[~0].

To jest symbol tyldy

person Underoos    schedule 23.06.2021