Respuestas:
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á IndexError
si el elemento esperado no existe. Esto significa que some_list[-1]
generará una excepción si some_list
está vacía, porque una lista vacía no puede tener un último elemento.
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.
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 Ninguno fuera el resultado
xs[-1] if xs else None
También puedes hacer:
alist.pop()
Depende de lo que quieras hacer con tu lista porque el pop()
método eliminará el último elemento.
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.
list[-1]
que error.
a[-1:][0]
en absoluto ? Él proporciona de a[-1]
todos modos también. ¿Explicación por favor?
En Python, ¿cómo obtienes el último elemento de una lista?
Para obtener el último elemento,
pasar -1
a la notación de subíndice:
>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'
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 -1
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'
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]
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'
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.
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 IndexError
que 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:
for
buclesComo característica de Python, no hay alcance interno en un for
bucle.
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 item
estaba 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
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 -1
realidad es el argumento predeterminado, por lo que list.pop
puede usarse sin un argumento de índice):
>>> a_list.pop()
'two'
Solo haz esto si
Estos son casos de uso válidos, pero no muy comunes.
No sé por qué lo haría, pero para completar, ya que reversed
devuelve 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
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'
Otro método:
some_list.reverse()
some_list[0]
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'
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.
También puede usar el siguiente código, si no desea obtener IndexError cuando la lista está vacía.
next(reversed(some_list), None)
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 .
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.
some_list.last
: sería una hermosa línea de código