Obtener el último elemento de una lista

Respuestas:

3109

some_list[-1] Es el más corto y más pitónico.

De hecho, puede hacer mucho más con esta sintaxis. La some_list[-n]sintaxis obtiene el enésimo elemento anterior. Entonces some_list[-1]obtiene el último elemento, some_list[-2]obtiene el penúltimo, etc., hasta el final some_list[-len(some_list)], lo que le da el primer elemento.

También puede establecer elementos de lista de esta manera. Por ejemplo:

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

Tenga en cuenta que obtener un elemento de la lista por índice aumentará IndexErrorsi el elemento esperado no existe. Esto significa que some_list[-1]generará una excepción si some_listestá vacía, porque una lista vacía no puede tener un último elemento.

Sasha Chedygov
fuente
66
Echo de menos algo como some_list.last: sería una hermosa línea de código
Dmitry P.
257

Si sus objetos str()o list()pueden terminar vacíos de esta manera: astr = ''o alist = [], entonces es posible que desee usarlos en alist[-1:]lugar de la alist[-1]"igualdad" de los objetos.

El significado de esto es:

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

Donde se hace la distinción es que devolver un objeto de lista vacío o un objeto str vacío es más "último elemento", como un objeto de excepción.

DevPlayer
fuente
26
Voté abajo porque siento que el núcleo de esta respuesta es incorrecto. Obtener una lista cuando desea un elemento solo pospone el inevitable "índice de lista fuera de rango", y eso es lo que debe suceder cuando se intenta obtener un elemento de una lista vacía. Para las cadenas astr [-1:] podría ser un enfoque válido ya que devuelve el mismo tipo que astr [-1], pero no creo que ':' ayude a lidiar con listas vacías (y la pregunta es sobre listas) . Si la idea es usar "alist [-1:]" como condicional en lugar de "len (alist)> 0", creo que es mucho más legible usar el posterior. (feliz de votar si me perdí algo)
Stan Kurdziel
99
Su voto negativo es comprensible y válido. Sin embargo, encuentro que hay dos campos básicos para los objetos de excepción destinados. Una certeza es que las excepciones detienen su aplicación. Un campo usa excepciones en las cláusulas try ya que el otro campo usaría la estructura if len (alist)> 0: en su lugar. En cualquier caso, las excepciones son objetos que detienen su código. Y, como tal, para mí hay menos objetos de secuencia como las secuencias devueltas "nulas" que no detienen su código. Mi preferencia es usar cláusulas IF para probar objetos "nulos" en lugar de objetos que detengan mi código que me adelanto con una cláusula try.
DevPlayer
66
Votado porque la sintaxis de corte vale la pena, sin embargo, estoy de acuerdo con @StanKurdziel en que la morfología es incorrecta, solo estás moviendo el poste de meta: descubrí que mi propia solución estaba relacionada con el uso principal de 'agregar esto a la lista si no lo hiciste 'ya lo agregue' (gráficos de líneas delta), por lo que la expresión combinada if len(my_vector) == 0 or my_vector[-1] != update_vales un patrón viable. pero ciertamente no es una solución global: sería bueno tener una forma de sintaxis donde Ninguno fuera el resultado
Mark Mullin
17
xs[-1] if xs else None
Gabriel
2
¿Por qué "evitarías" un IndexError? Si intenta indexar una lista o cadena vacía, obtendrá una excepción. Si desea manejar esa excepción, use una prueba / excepción, para eso está.
Chris Johnson el
94

También puedes hacer:

alist.pop()

Depende de lo que quieras hacer con tu lista porque el pop()método eliminará el último elemento.

Tauro Olson
fuente
71

La forma más sencilla de mostrar el último elemento en Python es

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

Hay muchos otros métodos para lograr ese objetivo, pero estos son cortos y dulces de usar.

Atul Arvind
fuente
2
Si la longitud de su lista es cero, esta solución funciona mientras list[-1]que error.
anon01
¿Qué? ¿Por qué haría a[-1:][0] en absoluto ? Él proporciona de a[-1]todos modos también. ¿Explicación por favor?
kaboom el
52

En Python, ¿cómo obtienes el último elemento de una lista?

Para obtener el último elemento,

  • sin modificar la lista, y
  • suponiendo que sepa que la lista tiene un último elemento (es decir, no está vacío)

pasar -1a la notación de subíndice:

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

Explicación

Los índices y sectores pueden tomar enteros negativos como argumentos.

He modificado un ejemplo de la documentación para indicar a qué elemento de una secuencia hace referencia cada índice, en este caso, en la cadena "Python", hace -1referencia al último elemento, el carácter 'n',:

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

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

Asignación mediante desembalaje iterable

Este método puede materializar innecesariamente una segunda lista con el fin de obtener el último elemento, pero en aras de la integridad (y dado que admite cualquier iterable, no solo listas):

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

El nombre de la variable, head está vinculado a la lista innecesaria recién creada:

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

Si tiene la intención de no hacer nada con esa lista, esto sería más apropiado:

*_, last = a_list

O, realmente, si sabe que es una lista (o al menos acepta la notación de subíndice):

last = a_list[-1]

En una función

Un comentarista dijo:

Desearía que Python tuviera una función para first () y last () como lo hace Lisp ... eliminaría muchas funciones lambda innecesarias.

Estos serían bastante simples de definir:

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

def first(a_list):
    return a_list[0]

O use operator.itemgetter:

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

En cualquier caso:

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

Casos especiales

Si está haciendo algo más complicado, es posible que le resulte más eficaz obtener el último elemento de formas ligeramente diferentes.

Si es nuevo en la programación, debe evitar esta sección, ya que combina partes semánticamente diferentes de algoritmos juntas. Si cambia su algoritmo en un lugar, puede tener un impacto no deseado en otra línea de código.

Trato de proporcionar advertencias y condiciones lo más completamente posible, pero es posible que me haya perdido algo. Comenta si crees que estoy dejando una advertencia.

Rebanar

Un segmento de una lista devuelve una nueva lista, por lo que podemos dividir desde -1 hasta el final si vamos a querer el elemento en una nueva lista:

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

Esto tiene la ventaja de no fallar si la lista está vacía:

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

Mientras que intentar acceder por índice genera un problema IndexErrorque debería ser manejado:

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

Pero nuevamente, el corte para este propósito solo debe hacerse si necesita:

  • una nueva lista creada
  • y la nueva lista estará vacía si la lista anterior estaba vacía.

for bucles

Como característica de Python, no hay alcance interno en un forbucle.

Si ya está realizando una iteración completa sobre la lista, el último elemento seguirá siendo referenciado por el nombre de variable asignado en el bucle:

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

Esto no es semánticamente lo último en la lista. Esto es semánticamente lo último a lo que itemestaba obligado el nombre .

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

Por lo tanto, esto solo debe usarse para obtener el último elemento si

  • ya están en bucle y
  • sabe que el ciclo finalizará (no se romperá o saldrá debido a errores), de lo contrario apuntará al último elemento al que hace referencia el ciclo.

Conseguirlo y eliminarlo

También podemos mutar nuestra lista original eliminando y devolviendo el último elemento:

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

Pero ahora se modifica la lista original.

(en -1realidad es el argumento predeterminado, por lo que list.poppuede usarse sin un argumento de índice):

>>> a_list.pop()
'two'

Solo haz esto si

  • sabe que la lista tiene elementos o está preparada para manejar la excepción si está vacía, y
  • tiene la intención de eliminar el último elemento de la lista, tratándolo como una pila.

Estos son casos de uso válidos, pero no muy comunes.

Guardar el resto del reverso para más tarde:

No sé por qué lo haría, pero para completar, ya que reverseddevuelve un iterador (que admite el protocolo de iterador) puede pasar su resultado a next:

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

Entonces es como hacer lo contrario de esto:

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

Pero no puedo pensar en una buena razón para hacer esto, a menos que necesite el resto del iterador inverso más adelante, que probablemente se parecería más a esto:

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

use_later = list(reverse_iterator)

y ahora:

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

Para evitarlo IndexError: list index out of range, use esta sintaxis:

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
fuente
11

Otro método:

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

lst[-1]es el mejor enfoque, pero con iterables generales, considere more_itertools.last:

Código

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
fuente
6

list[-1]recuperará el último elemento de la lista sin cambiar la lista. list.pop()recuperará el último elemento de la lista, pero mutará / cambiará la lista original. Por lo general, no se recomienda mutar la lista original.

Alternativamente, si, por alguna razón, está buscando algo menos pitónico, podría usarlo list[len(list)-1], suponiendo que la lista no esté vacía.

Sonriendo narcisista
fuente
2
Probablemente sea malo suponer que, por lo general, no se recomienda mutar la lista original, porque, después de todo, se lleva a cabo con mucha frecuencia
Aaron el
6

También puede usar el siguiente código, si no desea obtener IndexError cuando la lista está vacía.

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

Ok, pero ¿qué hay de común en casi todos los idiomas items[len(items) - 1]? Esta es la OMI la forma más fácil de obtener el último elemento, ya que no requiere ningún conocimiento pitónico .

Radek Anuszewski
fuente
3
items [len (items) - 1] es esencialmente lo que Python está haciendo debajo del capó, pero dado que el len de una secuencia ya está almacenado en la secuencia, no hay necesidad de contarlo, estás creando más trabajo del necesario.
Dan Gayle
21
como estás escribiendo Python, realmente deberías tratar de ser más Pythonic
Michael Wu
55
@MichaelWu No tiene sentido hacer eso. La forma pitónica a menudo no se explica por sí misma, necesita más atención cuando tiene que presentar nuevas personas para el proyecto y, por supuesto, no funcionaría cuando tiene que cambiar a otros lenguajes como Java; no puede usar el conocimiento específico de Python. Cuando omite la forma pitónica como es posible, también es mucho más fácil volver al proyecto después de meses / años.
Radek Anuszewski
77
@Pneumokok Usted señala, pero yo diría que la indexación de listas es una técnica muy básica de Python en comparación con los generadores. Además, ¿por qué molestarse en usar otra cosa que no sea C o quizás JavaScript si no va a aprovechar las herramientas y la sintaxis del lenguaje individual? Entonces puedes estar haciendo todo constantemente de la manera más difícil en todos tus proyectos.
Matthew Purdon el
Aunque no es muy pitónico, creo que esto es en algunos aspectos mejor que el some_list[-1]enfoque porque es más lógico y muestra lo que en realidad está haciendo mejor que some_list[-1]en mi opinión.
Byron Filer el