Respostas:
some_list[-1]
é o mais curto e mais pitonico.
De fato, você pode fazer muito mais com essa sintaxe. A some_list[-n]
sintaxe obtém o penúltimo elemento. Então, some_list[-1]
obtém o último elemento, some_list[-2]
obtém o penúltimo, etc, até o final some_list[-len(some_list)]
, o que fornece o primeiro elemento.
Você também pode definir elementos da lista dessa maneira. Por exemplo:
>>> 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]
Observe que a obtenção de um item da lista por índice aumentará um IndexError
se o item esperado não existir. Isso significa que some_list[-1]
irá gerar uma exceção se some_list
estiver vazio, porque uma lista vazia não pode ter um último elemento.
Se seus objetos str()
ou list()
puderem ficar vazios da seguinte maneira: astr = ''
ou alist = []
, convém usar em alist[-1:]
vez de alist[-1]
para a "mesmice" do objeto.
O significado disso é:
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
Onde a distinção está sendo feita é que retornar um objeto de lista vazio ou um objeto str vazio é mais "último elemento" - como um objeto de exceção.
if len(my_vector) == 0 or my_vector[-1] != update_val
é um padrão viável. mas certamente não é uma solução global - seria bom ter uma forma de sintaxe, onde Nenhum foi o resultado
xs[-1] if xs else None
Você também pode fazer:
alist.pop()
Depende do que você deseja fazer com sua lista, porque o pop()
método excluirá o último elemento.
A maneira mais simples de exibir o último elemento em python é
>>> list[-1:] # returns indexed value
[3]
>>> list[-1] # returns value
3
existem muitos outros métodos para atingir esse objetivo, mas são curtos e fáceis de usar.
list[-1]
ocorrerá um erro.
a[-1:][0]
em tudo ? Ele fornece de a[-1]
qualquer maneira também. Explicação, por favor?
No Python, como você obtém o último elemento de uma lista?
Para obter apenas o último elemento,
passe -1
para a notação subscrita:
>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'
Índices e fatias podem receber números inteiros negativos como argumentos.
Eu modifiquei um exemplo da documentação para indicar qual item em uma seqüência cada referências de índice, neste caso, na seqüência "Python"
, -1
faz referência ao último elemento, o caráter, 'n'
:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5
-6 -5 -4 -3 -2 -1
>>> p = 'Python'
>>> p[-1]
'n'
Esse método pode materializar desnecessariamente uma segunda lista com a finalidade de obter apenas o último elemento, mas por uma questão de completude (e uma vez que suporta qualquer iterável - e não apenas listas):
>>> *head, last = a_list
>>> last
'three'
O nome da variável head é vinculado à lista desnecessária criada recentemente:
>>> head
['zero', 'one', 'two']
Se você pretende não fazer nada com essa lista, isso seria mais apropriado:
*_, last = a_list
Ou, realmente, se você sabe que é uma lista (ou pelo menos aceita notação subscrita):
last = a_list[-1]
Um comentarista disse:
Eu gostaria que o Python tivesse uma função para first () e last () como o Lisp faz ... ele se livraria de muitas funções lambda desnecessárias.
Seria bastante simples de definir:
def last(a_list):
return a_list[-1]
def first(a_list):
return a_list[0]
Ou use operator.itemgetter
:
>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)
Em ambos os casos:
>>> last(a_list)
'three'
>>> first(a_list)
'zero'
Se você está fazendo algo mais complicado, pode ser mais eficiente obter o último elemento de maneiras ligeiramente diferentes.
Se você é iniciante em programação, evite esta seção, porque ela une partes semanticamente diferentes de algoritmos. Se você alterar seu algoritmo em um local, ele poderá ter um impacto não intencional em outra linha de código.
Tento fornecer advertências e condições da maneira mais completa possível, mas posso ter perdido alguma coisa. Por favor, comente se você acha que estou deixando uma ressalva.
Uma fatia de uma lista retorna uma nova lista - para que possamos fatiar de -1 até o final, se desejarmos o elemento em uma nova lista:
>>> a_slice = a_list[-1:]
>>> a_slice
['three']
Isso tem a vantagem de não falhar se a lista estiver vazia:
>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
... do_something(tail)
Considerando que a tentativa de acessar pelo índice gera um IndexError
que precisaria ser tratado:
>>> empty_list[-1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Mas, novamente, o fatiamento para esse fim só deve ser feito se você precisar:
for
rotaçõesComo um recurso do Python, não há escopo interno em um for
loop.
Se você já estiver executando uma iteração completa sobre a lista, o último elemento ainda será referenciado pelo nome da variável atribuída no loop:
>>> def do_something(arg): pass
>>> for item in a_list:
... do_something(item)
...
>>> item
'three'
Esta não é semanticamente a última coisa na lista. É semanticamente a última coisa a que o nome item
estava vinculado.
>>> 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'
Portanto, isso só deve ser usado para obter o último elemento se você
Também podemos alterar nossa lista original removendo e retornando o último elemento:
>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']
Mas agora a lista original foi modificada.
( -1
é realmente o argumento padrão, portanto, list.pop
pode ser usado sem um argumento de índice):
>>> a_list.pop()
'two'
Faça isso apenas se
Esses são casos de uso válidos, mas não muito comuns.
Não sei por que você faria isso, mas, para completar, como reversed
retorna um iterador (que suporta o protocolo iterador), você pode passar o resultado para next
:
>>> next(reversed([1,2,3]))
3
Então é como fazer o inverso disso:
>>> next(iter([1,2,3]))
1
Mas não consigo pensar em um bom motivo para fazer isso, a menos que você precise do resto do iterador reverso mais tarde, o que provavelmente seria mais parecido com isto:
reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)
use_later = list(reverse_iterator)
e agora:
>>> use_later
[2, 1]
>>> last_element
3
Para impedir IndexError: list index out of range
, use esta sintaxe:
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'
Outro método:
some_list.reverse()
some_list[0]
lst[-1]
é a melhor abordagem, mas com iterables gerais, 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á o último elemento da lista sem alterar a lista.
list.pop()
recuperará o último elemento da lista, mas irá alterar / alterar a lista original. Normalmente, não é recomendável alterar a lista original.
Como alternativa, se, por algum motivo, você estiver procurando por algo menos pitônico, poderia usar list[len(list)-1]
, supondo que a lista não esteja vazia.
Você também pode usar o código abaixo, se não desejar obter o IndexError quando a lista estiver vazia.
next(reversed(some_list), None)
Ok, mas e o comum em quase todos os idiomas items[len(items) - 1]
? Essa é a maneira mais fácil de obter o último elemento da IMO, porque não requer nada de conhecimento pitônico .
some_list[-1]
abordagem, porque é mais lógico e mostra o que realmente está fazendo melhor do que some_list[-1]
na minha opinião.
some_list.last
- seria uma bela linha de código