Cum să obțineți ultimul element al unei liste?

În Python, cum obțineți ultimul element al unei liste?


person Janusz    schedule 30.05.2009    source sursă


Răspunsuri (18)


some_list[-1] este cel mai scurt și cel mai pitonic.

De fapt, puteți face mult mai mult cu această sintaxă. Sintaxa some_list[-n] primește până la al n-lea element. Deci some_list[-1] primește ultimul element, some_list[-2] primește penulul, etc, până la some_list[-len(some_list)], care vă oferă primul element.

De asemenea, puteți seta elementele listei în acest fel. De exemplu:

>>> 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]

Rețineți că obținerea unui articol de listă după index va genera un IndexError dacă obiectul nu există. Aceasta înseamnă că some_list[-1] va ridica o excepție dacă some_list este goală, deoarece o listă goală nu poate avea un ultim element.

person Sasha Chedygov    schedule 30.05.2009
comment
Mi-e dor de ceva de genul some_list.last - ar fi o linie de cod frumoasă - person Dmitry P.; 20.01.2020

Dacă obiectele dvs. str() sau list() s-ar putea să fie goale ca: astr = '' sau alist = [], atunci s-ar putea să doriți să utilizați alist[-1:] în loc de alist[-1] pentru „asemănarea” obiectului.

Semnificația acestui lucru este:

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

În cazul în care se face distincția este că returnarea unui obiect listă gol sau a unui obiect str gol este mai mult „ultimul element”-cum ar fi decât un obiect excepție.

person DevPlayer    schedule 09.11.2010
comment
Am votat negativ pentru că consider că miezul acestui răspuns este incorect. Obținerea unei liste atunci când doriți un element nu face decât să amâne inevitabilul index al listei în afara intervalului - și asta ar trebui să se întâmple atunci când încercați să obțineți un element dintr-o listă goală. Pentru șiruri de caractere, astr[-1:] ar putea fi o abordare validă, deoarece returnează același tip ca astr[-1], dar nu cred că „:” ajută la tratarea listelor goale (și întrebarea este despre liste) . Dacă ideea este să folosiți alist[-1:] ca condițional în loc de len(alist) › 0, cred că este mult mai ușor de citit să îl folosiți mai târziu. (ma bucur sa votez daca am ratat ceva) - person Stan Kurdziel; 07.06.2015
comment
Votul în jos este de înțeles și valid. Cu toate acestea, găsesc că există două tabere de bază despre ceea ce sunt destinate obiectele excepționale. O certitudine este că excepțiile vă opresc aplicația. O tabără folosește excepții în clauzele try, deoarece cealaltă tabără ar folosi structura if len(alist)›0: în schimb. În orice caz, excepțiile sunt obiecte care vă opresc codul. Și, ca atare, pentru mine sunt mai puține obiecte de secvență ca apoi secvențe nule returnate care nu vă opresc codul. Preferința mea este să folosesc clauze IF pentru a testa obiecte nule în loc de obiecte care opresc codul meu pe care le preemptesc cu o clauză de încercare. - person DevPlayer; 08.06.2015
comment
Am votat pentru că sintaxa feliei merită discuția, totuși sunt de acord cu @StanKurdziel că morfologia este greșită, doar mutați ținta - am descoperit că propria mea soluție era legată de utilizarea principală a „adăugați asta la listă dacă nu ați făcut-o „nu îl adaugă deja” (grafice cu linii delta), deci expresia combinată if len(my_vector) == 0 or my_vector[-1] != update_val este un model funcțional. dar cu siguranță nu este o soluție globală - ar fi bine să existe o formă de sintaxă în care rezultatul nu a fost None - person Mark Mullin; 05.03.2017
comment
De ce ați evita o IndexError? Dacă încercați să indexați o listă sau un șir gol, veți obține o excepție. Dacă doriți să gestionați această excepție, utilizați un try/except - pentru asta este disponibil. - person Chris Johnson; 01.08.2018

De asemenea, puteți face:

last_elem = alist.pop()

Depinde de ce vrei să faci cu lista ta, deoarece metoda pop() va șterge ultimul element.

person Taurus Olson    schedule 30.05.2009

Cel mai simplu mod de a afișa ultimul element în python este

>>> list[-1:] # returns indexed value
    [3]
>>> list[-1]  # returns value
    3

Există multe alte metode pentru a atinge un astfel de obiectiv, dar acestea sunt scurte și dulci de utilizat.

person Atul Arvind    schedule 20.08.2012
comment
dacă lungimea listei dvs. este zero, această soluție funcționează în timp ce list[-1] va genera erori. - person anon01; 15.02.2018

În Python, cum obțineți ultimul element al unei liste?

Pentru a obține doar ultimul element,

  • fără a modifica lista și
  • presupunând că știți că lista are un ultim element (adică nu este goală)

trece -1 la notația indice:

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

Explicaţie

Indecii și feliile pot lua drept argumente numere întregi negative.

Am modificat un exemplu de din documentație pentru a indica ce articol dintr-o secvență fiecare index referințe, în acest caz, în șirul "Python", -1 face referire la ultimul element, caracterul, 'n':

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

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

Atribuire prin despachetare iterabilă

Această metodă poate materializa în mod inutil o a doua listă doar în scopul obținerii ultimului element, dar de dragul completității (și deoarece acceptă orice iterabil - nu doar liste):

>>> *head, last = a_list
>>> last
'three'

Numele variabilei, head este legat de lista inutilă nou creată:

>>> head
['zero', 'one', 'two']

Dacă intenționați să nu faceți nimic cu această listă, acesta ar fi mai potrivit:

*_, last = a_list

Sau, într-adevăr, dacă știți că este o listă (sau cel puțin acceptă notația cu indice):

last = a_list[-1]

Într-o funcție

Un comentator a spus:

Mi-aș dori ca Python să aibă o funcție pentru first() și last() așa cum face Lisp... ar scăpa de o mulțime de funcții lambda inutile.

Acestea ar fi destul de simplu de definit:

def last(a_list):
    return a_list[-1]

def first(a_list):
    return a_list[0]

Sau folosiți operator.itemgetter:

>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)

In orice caz:

>>> last(a_list)
'three'
>>> first(a_list)
'zero'

Cazuri speciale

Dacă faci ceva mai complicat, s-ar putea să găsești mai performant să obții ultimul element în moduri ușor diferite.

Dacă sunteți nou în programare, ar trebui să evitați această secțiune, deoarece cuplează părți diferite din punct de vedere semantic ale algoritmilor. Dacă vă schimbați algoritmul într-un loc, acesta poate avea un impact nedorit asupra unei alte linii de cod.

Încerc să ofer avertismente și condiții cât de complet pot, dar poate că am omis ceva. Vă rugăm să comentați dacă credeți că omit o avertizare.

Tăierea

O porțiune dintr-o listă returnează o nouă listă - așa că putem tăia de la -1 până la sfârșit dacă vrem să dorim elementul într-o listă nouă:

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

Acest lucru are avantajul de a nu eșua dacă lista este goală:

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

În timp ce încercarea de a accesa prin index generează un IndexError care ar trebui gestionat:

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

Dar din nou, felierea în acest scop ar trebui făcută numai dacă aveți nevoie de:

  • o nouă listă creată
  • iar noua listă să fie goală dacă lista anterioară era goală.

for bucle

Ca o caracteristică a lui Python, nu există o acoperire interioară într-o buclă for.

Dacă efectuați deja o iterație completă peste listă, ultimul element va fi referit în continuare prin numele variabilei atribuit în buclă:

>>> def do_something(arg): pass
>>> for item in a_list:
...     do_something(item)
...     
>>> item
'three'

Acesta nu este din punct de vedere semantic ultimul lucru din listă. Acesta este, din punct de vedere semantic, ultimul lucru la care a fost legat numele, 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'

Prin urmare, acest lucru ar trebui folosit doar pentru a obține ultimul element dacă dvs

  • sunt deja în buclă și
  • știți că bucla se va termina (nu se va întrerupe sau nu va ieși din cauza erorilor), altfel va indica ultimul element referit de buclă.

Obținerea și îndepărtarea acestuia

De asemenea, putem modifica lista noastră originală eliminând și returnând ultimul element:

>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']

Dar acum lista originală este modificată.

(-1 este de fapt argumentul implicit, deci list.pop poate fi folosit fără un argument index):

>>> a_list.pop()
'two'

Fă asta doar dacă

  • știți că lista conține elemente sau sunteți pregătit să gestionați excepția dacă este goală și
  • intenționați să eliminați ultimul element din listă, tratându-l ca pe o stivă.

Acestea sunt cazuri de utilizare valide, dar nu foarte frecvente.

Salvează restul reversului pentru mai târziu:

Nu știu de ce ați face-o, dar pentru a fi complet, deoarece reversed returnează un iterator (care acceptă protocolul iterator), puteți transmite rezultatul lui next:

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

Deci este ca și cum ai face inversul:

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

Dar nu mă pot gândi la un motiv bun pentru a face acest lucru, cu excepția cazului în care veți avea nevoie de restul iteratorului invers mai târziu, care probabil ar arăta mai mult astfel:

reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)

use_later = list(reverse_iterator)

si acum:

>>> use_later
[2, 1]
>>> last_element
3
person Aaron Hall    schedule 23.06.2017

Pentru a preveni IndexError: list index out of range, utilizați această sintaxă:

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


O alta metoda:

some_list.reverse() 
some_list[0]
person Sanjay Pradeep    schedule 10.01.2016
comment
Aceasta este o metodă simplă în care puteți face aceeași operație și pe O(n), chiar dacă aveți opțiunea de a face în O(1). - person say_my_name; 08.06.2021

list[-1] va prelua ultimul element al listei fără a modifica lista. list.pop() va prelua ultimul element al listei, dar va modifica/schimba lista originală. De obicei, mutarea listei originale nu este recomandată.

Alternativ, dacă, dintr-un motiv oarecare, căutați ceva mai puțin pitonic, puteți folosi list[len(list)-1], presupunând că lista nu este goală.

person Sondering Narcissist    schedule 07.10.2016
comment
Probabil că este rău să presupunem că mutarea listei inițiale nu este de obicei recomandată, deoarece, la urma urmei, este foarte frecvent efectuată - person Aaron; 01.12.2016

Puteți folosi și codul de mai jos, dacă nu doriți să obțineți IndexError când lista este goală.

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

Ok, dar cum rămâne cu obișnuit în aproape orice limbă items[len(items) - 1]? Aceasta este IMO cea mai simplă modalitate de a obține ultimul element, deoarece nu necesită cunoștințe pythonice.

person Radek Anuszewski    schedule 07.10.2015
comment
items[len(items) - 1] este, în esență, ceea ce face Python sub capotă, dar deoarece len-ul unei secvențe este deja stocat în secvență, nu este nevoie să îl numărați, creați mai multă muncă decât este necesar. - person Dan Gayle; 10.10.2015
comment
din moment ce scrii Python, chiar ar trebui să încerci să fii mai Pythonic - person Michael Wu; 27.10.2015
comment
@MichaelWu Nu are sens să faci asta. Modul Pythonic de multe ori nu se explică de la sine, necesită mai multă atenție atunci când trebuie să introduci persoane noi pentru proiect și, desigur, nu ar funcționa atunci când trebuie să treci la alte limbi precum Java - nu poți folosi cunoștințele specifice Python. Când omiteți modul pythonic pe cât posibil, este mult mai ușor să reveniți la proiect după luni/ani. - person Radek Anuszewski; 31.10.2015
comment
@Pneumokok Înțelegi, dar aș susține că indexarea listelor este o tehnică Python foarte de bază în comparație cu generatoarele. De asemenea, de ce să vă deranjați să utilizați altceva decât C sau poate javascript dacă nu veți profita de instrumentele și sintaxa individuale ale limbajului? Atunci poți face totul în mod constant în toate proiectele tale. - person Matthew Purdon; 03.12.2015
comment
Deși nu este foarte pythonic, cred că aceasta este în unele privințe mai bună decât abordarea some_list[-1], deoarece este mai logică și arată ce face de fapt mai bine decât some_list[-1] după părerea mea. - person Byron Filer; 05.11.2016
comment
Ce se va întâmpla pentru my_test = [] last_item = my_test[len(my_test) - 1]. Acest lucru va genera, de asemenea, o excepție pentru IndexError ca și alte răspunsuri. Deși, cred că excepțiile sunt valide și bune pentru că știu ce să fac cu modelul meu preferat de codare try:...except:...else:...finally:... în Python. - person Fr0zenFyr; 14.04.2018

Calea Pitonică

Deci, să considerăm că avem o listă a = [1,2,3,4], în Python Lista poate fi manipulată pentru a ne oferi o parte din ea sau un element din ea, folosind următoarea comandă se poate obține cu ușurință ultimul element.

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

Iată soluția pentru întrebarea dvs.

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.

Ieșire:

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

Pentru a evita IndexError: listează indexul în afara intervalului, poți folosi această bucată de cod.

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
Problema cu această soluție este că în cazul lui len(lst) == 0 ar returna un șir, atunci când așteptați un int. - person raulmd13; 29.03.2021
comment
Fix.......... - person HASAN HÜSEYİN YÜCEL; 29.03.2021
comment
Ceea ce am vrut să spun este că această metodă funcționează cu un anumit tip de date. Nu poate fi folosit pentru toate tipurile de liste. Dar nu este un răspuns rău. - person raulmd13; 30.03.2021

Va trebui doar să luați și să puneți indexul [-1]. De exemplu:

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

Veți obține 2 ca rezultat.

person AI Nerd    schedule 07.05.2021

Accesarea ultimului element din listă în Python:

1: accesați ultimul element cu indexare negativă -1

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

2. Accesați ultimul element cu metoda pop()

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

Cu toate acestea, metoda pop va elimina ultimul element din listă.

person Gunjan    schedule 04.06.2021
comment
Deși este adevărat, .pop este distructiv (după cum este clarificat de alte răspunsuri). Nu numai că primește ultimul element din listă, dar îl elimină și din listă - person Wondercricket; 08.06.2021

Dacă faceți my_list[-1], acesta returnează ultimul element al listei. Indicii de secvență negativă reprezintă poziții de la sfârșitul matricei. Indexarea negativă înseamnă începutul de la sfârșit, -1 se referă la ultimul articol, -2 se referă la ultimul articol etc.

person Hadi Mir    schedule 26.12.2020

Nu am găsit niciun răspuns care să menționeze asta. Deci adăugând.

Ai putea încerca și some_list[~0].

Acesta este simbolul tildei

person Underoos    schedule 23.06.2021