Cómo obtener el último elemento de una lista

10 minutos de lectura

Como obtener el ultimo elemento de una lista
Janusz

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

1646747836 754 Como obtener el ultimo elemento de una lista
Sasha Chedygov

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

De hecho, puede hacer mucho más con esta sintaxis. los some_list[-n] la sintaxis obtiene el elemento n-hasta el último. Entonces some_list[-1] obtiene el último elemento, some_list[-2] obtiene el penúltimo, etc., todo el camino hasta some_list[-len(some_list)]que te 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 la lista por índice generará un IndexError si el elemento 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.

Como obtener el ultimo elemento de una lista
DevPlayer

Si tu str() o list() los objetos pueden terminar estando vacíos así: astr="" o 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 la distinción que se hace es que devolver un objeto de lista vacío o un objeto str vacío es más como un “último elemento” que un objeto de excepción.

  • Votado a la baja 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 debería suceder cuando 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

    7 de junio de 2015 a las 6:27

  • 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 usa excepciones en las cláusulas de prueba mientras 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í son menos objetos de secuencia como las secuencias “nulas” devueltas 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 interrumpo con una cláusula de prueba.

    – DevPlayer

    08/06/2015 a las 20:58

  • Voté a favor porque vale la pena discutir la sintaxis de corte, sin embargo, estoy de acuerdo con @StanKurdziel en que la morfología es incorrecta, solo estás moviendo el poste de la portería. Descubrí que mi propia solución estaba relacionada con el uso principal de ‘agregar esto a la lista si no ‘todavía no lo agregué’ (gráficos de líneas delta), por lo que la expresión combinada 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 un formulario de sintaxis donde Ninguno fuera el resultado

    –Mark Mullin

    5 de marzo de 2017 a las 20:16

  • xs[-1] if xs else None

    – gabriel

    28 de abril de 2018 a las 2:35

  • ¿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 un intento/excepto, para eso está.

    –Chris Johnson

    1 de agosto de 2018 a las 2:18

1646747839 918 Como obtener el ultimo elemento de una lista
tauro olson

También puedes hacer:

last_elem = alist.pop()

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

  • NOTA: vale la pena saber que esto también eliminaría el último elemento de la lista.

    – Anís LOUNIS

    28 oct 2021 a las 18:22

1646747839 136 Como obtener el ultimo elemento de una lista
atul arvind

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 agradables de usar.

1646747840 990 Como obtener el ultimo elemento de una lista
Rusia debe sacar a Putin

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

Para obtener el último elemento,

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

pasar -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 aceptar números 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 desempaquetado iterable

Este método puede materializar innecesariamente una segunda lista con el fin de obtener solo el último elemento, pero en aras de la exhaustividad (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, realmente, si sabe que es una lista (o al menos acepta la notación de subíndice):

last = a_list[-1]

en una funcion

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 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 maneras ligeramente diferentes.

Si es nuevo en la programación, debe evitar esta sección, ya que acopla partes de algoritmos semánticamente diferentes. 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 tan completas como puedo, pero es posible que me haya perdido algo. Por favor comente si cree que estoy dejando una advertencia.

rebanar

Una porción 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 una IndexError que tendría que 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 for lazo.

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

>>> 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 que el nombre, itemestaba 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
  • 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 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.

(-1 es en realidad el argumento predeterminado, por lo que list.pop se puede usar 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ías, 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

Así que 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

  • ¡Esta respuesta obtiene la recompensa por la respuesta más larga que he visto con una solución alta a la tasa de palabras!

    – Causando subdesbordamientos en todas partes

    16 de febrero a las 23:33

Para prevenir IndexError: list index out of rangeutilice 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'

  • ¡Esta respuesta obtiene la recompensa por la respuesta más larga que he visto con una solución alta a la tasa de palabras!

    – Causando subdesbordamientos en todas partes

    16 de febrero a las 23:33

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'

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad