Obtener el último elemento de una lista

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

preguntado el 30 de mayo de 09 a las 16:05

13 Respuestas

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

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

También puede configurar los elementos de la 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 lista por índice generará un IndexError si el artículo esperado no existe. Esto significa que some_list[-1] generará una excepción si some_list está vacío, porque una lista vacía no puede tener un último elemento.

Respondido 22 Oct 20, 22:10

Extraño algo como some_list.last - sería una hermosa línea de código - Dmitri P.

Si str() or list() los objetos pueden terminar estando vacíos así: astr = '' or alist = [], entonces es posible que desee utilizar alist[-1:] en lugar de alist[-1] para el objeto "igualdad".

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 un "último elemento", como un objeto de excepción.

Respondido el 08 de junio de 18 a las 19:06

Votado en contra porque creo 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 debería suceder cuando se intenta obtener un elemento de una lista vacía. Para 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 último. (feliz de votar si me perdí algo) - Stan Kurdziel

Su voto negativo es comprensible y válido. Sin embargo, encuentro que hay dos campos básicos sobre para qué están destinados los objetos de excepción. Una certeza es que las excepciones detienen su aplicación. Un campo utiliza excepciones en las cláusulas try, ya que el otro campo utilizarí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í son menos objetos de secuencia como luego devuelve "nulas" -secuencias 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

Voto a favor porque vale la pena discutir la sintaxis del segmento, sin embargo, estoy de acuerdo con @StanKurdziel en que la morfología es incorrecta, solo está moviendo el objetivo: descubrí que mi propia solución estaba relacionada con el uso principal de 'agregar esto a la lista si no 't ya lo agregas' (gráficos de líneas delta), por lo que la expresión if len(my_vector) == 0 or my_vector[-1] != update_val es un patrón viable. pero ciertamente no es una solución global; sería bueno tener una forma de sintaxis donde None fue el resultado. Marcos Mullin

xs[-1] if xs else None - Gabriel

¿Por qué "evitaría" un IndexError? Si intenta indexar una lista o cadena vacía, obtendrá una excepción. Si desea manejar esa excepción, use un try / except, para eso está. - Chris Johnson

También puedes hacer:

alist.pop()

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

Respondido 15 Jul 16, 14:07

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 tal objetivo, pero estos son breves y fáciles de usar.

Respondido 21 ago 12, 05:08

si la longitud de su lista es cero, esta solución funciona mientras list[-1] será un error. - anon01

¿Qué? ¿Por qué harías a[-1:][0] en absoluto? Él proveé a[-1] de todos modos también. ¿Explicación por favor? - kaboom

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

Para obtener el último elemento,

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

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

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

Explicación

Los índices y las porciones 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", -1 hace referencia 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 propósito 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 recién creada innecesaria:

>>> 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, en realidad, 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 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 usar 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, puede 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 empareja partes de algoritmos de otro modo semánticamente diferentes. Si cambia su algoritmo en un lugar, puede tener un impacto no deseado en otra línea de código.

Intento proporcionar advertencias y condiciones de la forma más completa posible, pero es posible que me haya perdido algo. Por favor comente si cree que estoy dejando una advertencia.

El rebanar

Un segmento de una lista devuelve una nueva lista, por lo que podemos dividir desde -1 hasta el final si queremos que el elemento esté 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 IndexError que necesitarí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, cortar para este propósito solo debe hacerse si necesita:

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

for bucles

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

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 ciclo:

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

Esto no es semánticamente lo último de la lista. Esto es semánticamente lo último que el nombre, item, estaba obligado a.

>>> 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
  • usted sabe que el ciclo terminará (no se romperá ni saldrá debido a errores), de lo contrario apuntará al último elemento al que hace referencia el ciclo.

Conseguirlo y quitarlo

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.

(-1 es en realidad el argumento predeterminado, por lo que list.pop se puede utilizar sin un argumento de índice):

>>> a_list.pop()
'two'

Solo haz esto si

  • sabe que la lista tiene elementos, o está preparado 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.

Guardando el resto del reverso para más tarde:

No sé por qué lo haría, pero para completar, ya que reversed devuelve un iterador (que admite el protocolo 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

Respondido el 21 de diciembre de 17 a las 03:12

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

Respondido el 25 de Septiembre de 19 a las 01:09

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'

Respondido 01 ago 18, 04:08

Otro método:

some_list.reverse() 
some_list[0]

Respondido el 14 de junio de 19 a las 10:06

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 modificar la lista original.

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

Respondido 07 Oct 16, 03:10

Probablemente sea malo suponer que generalmente no se recomienda mutar la lista original, porque, después de todo, se lleva a cabo con mucha frecuencia: Aaron

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

next(reversed(some_list), None)

Respondido el 02 de junio de 17 a las 14:06

Ok, pero ¿qué pasa con lo común en casi todos los idiomas? items[len(items) - 1]? En mi opinión, esta es la forma más fácil de obtener el último elemento, porque no requiere nada pitónico conocimiento.

Respondido 07 Oct 15, 18:10

items [len (items) - 1] es esencialmente lo que Python está haciendo bajo el capó, pero como el len de una secuencia ya está almacenado en la secuencia, no es necesario contarlo, está creando más trabajo del necesario. - dan gayle

ya que estás escribiendo Python, deberías intentar ser más Python - Michael Wu

@MichaelWu No tiene sentido hacer eso. La forma Pythonic a menudo no se explica por sí misma, necesita más atención cuando tiene que presentar nuevas personas al 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

@Pneumokok Tienes razón, pero yo diría que la indexación de listas es una La técnica básica de Python en comparación con los generadores. Además, ¿por qué molestarse en usar algo que no sea C o quizás javascript si no va a aprovechar las herramientas de lenguaje y la sintaxis individuales? Entonces puede hacer todo de la manera más difícil en todos sus proyectos. - mateo purdon

Aunque no es muy pitónico, creo que en algunos aspectos es mejor que el some_list[-1] enfoque porque es más lógico y muestra lo que realmente está haciendo mejor que some_list[-1] en mi opinión. - Archivador Byron

Aquí está la solución para su consulta.

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.

Salida:

>>> first
>>> last
>>> middle

Respondido 03 Jul 20, 06:07

Si lo hace my_list[-1] esto devuelve el último elemento de la lista. Los índices de secuencia negativa representan posiciones desde el final de la matriz. La indexación negativa significa comenzar desde el final, -1 se refiere al último elemento, -2 se refiere al penúltimo elemento, etc.

Respondido el 28 de diciembre de 20 a las 09:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.