Das letzte Element einer Liste abrufen

2066

Wie erhalten Sie in Python das letzte Element einer Liste?

Janusz
quelle

Antworten:

3107

some_list[-1] ist die kürzeste und pythonischste.

Mit dieser Syntax können Sie sogar noch viel mehr tun. Die some_list[-n]Syntax erhält das n-te vorletzte Element. So some_list[-1]bekommt das letzte Element, some_list[-2]erhält die vorletzte, usw., den ganzen Weg hinunter zu some_list[-len(some_list)], mit dem Sie das erste Element gibt.

Auf diese Weise können Sie auch Listenelemente festlegen. Zum Beispiel:

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

Beachten Sie, dass beim Abrufen eines Listenelements nach Index ein ausgelöst wird, IndexErrorwenn das erwartete Element nicht vorhanden ist. Dies bedeutet, dass some_list[-1]eine Ausnahme ausgelöst some_listwird, wenn sie leer ist, da eine leere Liste kein letztes Element enthalten kann.

Sasha Chedygov
quelle
6
Ich vermisse so etwas wie some_list.last- es wäre eine schöne Codezeile
Dmitry P.
257

Wenn Ihre str()oder list()Objekte möglicherweise leer sind: astr = ''oder alist = [], dann möchten Sie möglicherweise alist[-1:]anstelle von alist[-1]"Objektgleichheit" verwenden.

Die Bedeutung davon ist:

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

Wenn unterschieden wird, ist die Rückgabe eines leeren Listenobjekts oder eines leeren str-Objekts eher "letztes Element" als ein Ausnahmeobjekt.

DevPlayer
quelle
26
Abgestimmt, weil ich der Meinung bin, dass der Kern dieser Antwort falsch ist. Das Abrufen einer Liste, wenn Sie ein Element möchten, verschiebt nur den unvermeidlichen "Listenindex außerhalb des Bereichs" - und genau das sollte passieren, wenn Sie versuchen, ein Element aus einer leeren Liste abzurufen. Für Strings könnte astr [-1:] ein gültiger Ansatz sein, da es den gleichen Typ wie astr [-1] zurückgibt, aber ich glaube nicht, dass das ':' hilft, mit leeren Listen umzugehen (und die Frage betrifft Listen). . Wenn die Idee darin besteht, "alist [-1:]" als Bedingung anstelle von "len (alist)> 0" zu verwenden, ist es meiner Meinung nach viel besser lesbar, die spätere zu verwenden. (Ich freue mich, wenn ich etwas verpasst habe)
Stan Kurdziel
9
Ihre Abstimmung ist verständlich und gültig. Ich finde jedoch, dass es zwei grundlegende Lager gibt, für die Ausnahmeobjekte bestimmt sind. Eine Gewissheit ist, dass Ausnahmen Ihre App stoppen. Ein Lager verwendet Ausnahmen in try-Klauseln, da das andere Lager stattdessen die Struktur if len (alist)> 0: verwenden würde. In jedem Fall sind Ausnahmen Objekte, die Ihren Code anhalten. Und als solche sind für mich weniger Sequenzobjekte wie dann zurückgegebene "Null" -Sequenzen, die Ihren Code nicht anhalten. Ich bevorzuge die Verwendung von IF-Klauseln zum Testen auf "Null" -Objekte anstelle von Objekten, die meinen Code anhalten, den ich mit einer try-Klausel vorwegnehme.
DevPlayer
6
Upvoted, weil die Slice-Syntax die Diskussion wert ist. Ich stimme jedoch @StanKurdziel zu, dass die Morphologie falsch ist. Sie verschieben nur den Torpfosten. Ich habe festgestellt, dass meine eigene Lösung mit der primären Verwendung von "Dies zur Liste hinzufügen" zusammenhängt, wenn Sie dies nicht getan haben 'füge es noch nicht hinzu' (Delta-Liniendiagramme), daher ist der kombinierte Ausdruck if len(my_vector) == 0 or my_vector[-1] != update_valein praktikables Muster. Aber es ist sicherlich keine globale Lösung - es wäre schön, eine Syntaxform zu haben, in der None das Ergebnis war
Mark Mullin
17
xs[-1] if xs else None
Gabriel
2
Warum sollten Sie einen IndexError "vermeiden"? Wenn Sie versuchen, eine leere Liste oder Zeichenfolge zu indizieren, wird eine Ausnahme angezeigt. Wenn Sie diese Ausnahme behandeln möchten, verwenden Sie try / exception - dafür ist es da.
Chris Johnson
94

Sie können auch tun:

alist.pop()

Dies hängt davon ab, was Sie mit Ihrer Liste tun möchten, da die pop()Methode das letzte Element löscht.

Stier Olson
quelle
71

Der einfachste Weg, das letzte Element in Python anzuzeigen, ist

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

Es gibt viele andere Methoden, um ein solches Ziel zu erreichen, aber diese sind kurz und bündig.

Atul Arvind
quelle
2
Wenn Ihre Listenlänge Null ist, funktioniert diese Lösung, während list[-1]ein Fehler auftritt.
anon01
Was? Warum würden Sie tun , a[-1:][0] überhaupt ? Er sorgt a[-1]sowieso auch. Erklärung bitte?
Kaboom
52

Wie erhalten Sie in Python das letzte Element einer Liste?

Um nur das letzte Element zu erhalten,

  • ohne die Liste zu ändern, und
  • vorausgesetzt , Sie wissen , die Liste hat ein letztes Element (dh es ist nicht leer)

Übergabe -1an die tiefgestellte Notation:

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

Erläuterung

Indizes und Slices können negative Ganzzahlen als Argumente verwenden.

Ich habe ein Beispiel modifizierter aus der Dokumentation , die Artikel in einer Sequenz , um anzuzeigen , jeden Index Referenzen, in diesem Fall in der Zeichenfolge "Python", -1verweist auf das letzte Element, das Zeichen, 'n':

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

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

Zuordnung durch iterierbares Auspacken

Diese Methode kann unnötigerweise eine zweite Liste materialisieren, um nur das letzte Element zu erhalten, aber der Vollständigkeit halber (und da sie jede iterierbare unterstützt - nicht nur Listen):

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

Der Variablenname head ist an die unnötige neu erstellte Liste gebunden:

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

Wenn Sie nicht beabsichtigen, mit dieser Liste nichts zu tun, wäre dies eher apropos:

*_, last = a_list

Oder wirklich, wenn Sie wissen, dass es sich um eine Liste handelt (oder zumindest die tiefgestellte Notation akzeptiert):

last = a_list[-1]

In einer Funktion

Ein Kommentator sagte:

Ich wünschte, Python hätte eine Funktion für first () und last () wie Lisp ... es würde viele unnötige Lambda-Funktionen beseitigen.

Diese wären recht einfach zu definieren:

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

def first(a_list):
    return a_list[0]

Oder verwenden Sie operator.itemgetter:

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

In beiden Fällen:

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

Sonderfälle

Wenn Sie etwas Komplizierteres tun, ist es möglicherweise leistungsfähiger, das letzte Element auf etwas andere Weise zu erhalten.

Wenn Sie neu in der Programmierung sind, sollten Sie diesen Abschnitt vermeiden, da er ansonsten semantisch unterschiedliche Teile von Algorithmen miteinander verbindet. Wenn Sie Ihren Algorithmus an einer Stelle ändern, kann dies unbeabsichtigte Auswirkungen auf eine andere Codezeile haben.

Ich versuche, Vorbehalte und Bedingungen so vollständig wie möglich bereitzustellen, aber ich habe möglicherweise etwas verpasst. Bitte kommentieren Sie, wenn Sie denken, dass ich eine Einschränkung auslasse.

Schneiden

Ein Slice einer Liste gibt eine neue Liste zurück. Wir können also von -1 bis zum Ende schneiden, wenn wir das Element in einer neuen Liste haben möchten:

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

Dies hat den Vorteil, dass es nicht fehlschlägt, wenn die Liste leer ist:

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

Während der Versuch, über einen Index zuzugreifen, eine Frage aufwirft, IndexErrordie behandelt werden müsste:

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

Aber auch hier sollte das Schneiden nur zu diesem Zweck durchgeführt werden, wenn Sie Folgendes benötigen:

  • eine neue Liste erstellt
  • und die neue Liste muss leer sein, wenn die vorherige Liste leer war.

for Schleifen

Als eine Funktion von Python gibt es kein inneres Scoping in einer forSchleife.

Wenn Sie bereits eine vollständige Iteration über die Liste durchführen, wird das letzte Element weiterhin durch den in der Schleife zugewiesenen Variablennamen referenziert:

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

Dies ist semantisch nicht das Letzte in der Liste. Dies ist semantisch das Letzte, an das der Name itemgebunden war.

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

Daher sollte dies nur verwendet werden, um das letzte Element zu erhalten, wenn Sie

  • schleifen bereits und
  • Sie wissen, dass die Schleife beendet wird (nicht aufgrund von Fehlern unterbrochen oder beendet wird), andernfalls zeigt sie auf das letzte Element, auf das die Schleife verweist.

Erhalten und Entfernen

Wir können unsere ursprüngliche Liste auch mutieren, indem wir das letzte Element entfernen und zurückgeben:

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

Aber jetzt wird die ursprüngliche Liste geändert.

( -1ist eigentlich das Standardargument, list.popkann also ohne Indexargument verwendet werden):

>>> a_list.pop()
'two'

Tun Sie dies nur, wenn

  • Sie wissen, dass die Liste Elemente enthält, oder sind bereit, die Ausnahme zu behandeln, wenn sie leer ist, und
  • Sie beabsichtigen, das letzte Element aus der Liste zu entfernen und es wie einen Stapel zu behandeln.

Dies sind gültige Anwendungsfälle, aber nicht sehr häufig.

Speichern Sie den Rest der Rückseite für später:

Ich weiß nicht, warum Sie das tun würden, aber der Vollständigkeit halber können Sie das Ergebnis übergeben , da reversedein Iterator zurückgegeben wird (der das Iterator-Protokoll unterstützt) next:

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

Es ist also so, als würde man das Gegenteil tun:

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

Aber ich kann mir keinen guten Grund dafür vorstellen, es sei denn, Sie benötigen später den Rest des Reverse-Iterators, der wahrscheinlich eher so aussehen würde:

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

use_later = list(reverse_iterator)

und nun:

>>> use_later
[2, 1]
>>> last_element
3
Aaron Hall
quelle
14

IndexError: list index out of rangeVerwenden Sie diese Syntax, um dies zu verhindern :

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'
Valentin Podkamennyi
quelle
11

Eine andere Methode:

some_list.reverse() 
some_list[0]
Sanjay Pradeep
quelle
10

lst[-1]ist der beste Ansatz, aber mit allgemeinen Iterabilitäten sollten Sie Folgendes berücksichtigen more_itertools.last:

Code

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'
Pylang
quelle
6

list[-1]ruft das letzte Element der Liste ab, ohne die Liste zu ändern. list.pop()wird das letzte Element der Liste abrufen, aber die ursprüngliche Liste wird mutiert / geändert. Normalerweise wird das Mutieren der ursprünglichen Liste nicht empfohlen.

Wenn Sie aus irgendeinem Grund nach etwas weniger Pythonischem suchen, können Sie es auch verwenden list[len(list)-1], vorausgesetzt, die Liste ist nicht leer.

Sondering Narzisst
quelle
2
Es ist wahrscheinlich schlecht anzunehmen, dass das Mutieren der ursprünglichen Liste normalerweise nicht empfohlen wird, da es schließlich sehr häufig durchgeführt wird
Aaron
6

Sie können auch den folgenden Code verwenden, wenn Sie IndexError nicht erhalten möchten, wenn die Liste leer ist.

next(reversed(some_list), None)
Yavuz Mester
quelle
4

Ok, aber was ist mit in fast jeder Sprache üblich items[len(items) - 1]? Dies ist IMO der einfachste Weg, um das letzte Element zu erhalten, da es keine pythonischen Kenntnisse erfordert .

Radek Anuszewski
quelle
3
items [len (items) - 1] ist im Wesentlichen das, was Python unter der Haube tut. Da jedoch die Länge einer Sequenz bereits in der Sequenz gespeichert ist, muss sie nicht gezählt werden. Sie erstellen mehr Arbeit als erforderlich.
Dan Gayle
21
Da Sie Python schreiben, sollten Sie wirklich versuchen, mehr Pythonic zu sein
Michael Wu
5
@ MichaelWu Es macht keinen Sinn, das zu tun. Der pythonische Weg ist oft nicht selbsterklärend, benötigt mehr Aufmerksamkeit, wenn Sie neue Personen in das Projekt einführen müssen, und funktioniert natürlich nicht, wenn Sie zu anderen Sprachen wie Java wechseln müssen - Sie können kein Python-spezifisches Wissen verwenden. Wenn Sie die Python-Methode so weit wie möglich weglassen, ist es viel einfacher, auch nach Monaten / Jahren zum Projekt zurückzukehren.
Radek Anuszewski
7
@Pneumokok Sie machen Punkt, aber ich würde argumentieren, dass die Listenindizierung eine sehr grundlegende Python-Technik ist, verglichen mit etwa Generatoren. Warum sollten Sie sich auch die Mühe machen, etwas anderes als C oder vielleicht Javascript zu verwenden, wenn Sie die einzelnen Sprachwerkzeuge und die Syntax nicht nutzen möchten? Dann können Sie in all Ihren Projekten konsequent alles auf die harte Tour machen.
Matthew Purdon
Obwohl es nicht sehr pythonisch ist, denke ich, dass dies in mancher Hinsicht besser ist als der some_list[-1]Ansatz, weil es logischer ist und zeigt, was es tatsächlich besser macht als some_list[-1]meiner Meinung nach.
Byron Filer