Obtendo o último elemento de uma lista


Respostas:


3109

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 IndexErrorse o item esperado não existir. Isso significa que some_list[-1]irá gerar uma exceção se some_listestiver vazio, porque uma lista vazia não pode ter um último elemento.


6
Eu sinto falta de algo como some_list.last- seria uma bela linha de código
Dmitry P.

257

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.


26
Voto negativo, porque sinto que o núcleo desta resposta está incorreto. Obter uma lista quando você deseja um elemento apenas adia o inevitável "índice de lista fora do intervalo" - e é isso que deve acontecer ao tentar obter um elemento de uma lista vazia. Para Strings, astr [-1:] poderia ser uma abordagem válida, pois retorna o mesmo tipo que astr [-1], mas não acho que o ':' ajude a lidar com listas vazias (e a pergunta é sobre listas) . Se a idéia é usar "alist [-1:]" como condicional, em vez de "len (alist)> 0", acho muito mais legível usá-lo posteriormente. (feliz de upvote se eu perdi alguma coisa)
Stan Kurdziel

9
Seu voto negativo é compreensível e válido. No entanto, acho que existem dois campos básicos sobre a que objetos de exceção se destinam. Uma certeza é que as exceções interrompem seu aplicativo. Um campo usa exceções nas cláusulas try, pois o outro campo usaria a estrutura if len (alist)> 0:. De qualquer forma, exceções são objetos que interrompem seu código. E, como tal, para mim são menos objetos de sequência como os retornados "nulos" - seqüências que não interrompem seu código. Minha preferência é usar cláusulas IF para testar objetos "nulos" em vez de objetos que interrompem meu código que eu prefiro com uma cláusula try.
DevPlayer

6
Promovido porque a sintaxe da fatia vale a pena discutir, no entanto, eu concordo com @StanKurdziel que a morfologia está errada, você está apenas movendo a trave - descobri que minha própria solução estava relacionada ao uso principal de 'adicione isso à lista se você não 'já o adicione' (gráficos de linhas delta), portanto a expressão combinada 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
Mark Mullin

17
xs[-1] if xs else None
Gabriel

2
Por que você "evitaria" um IndexError? Se você tentar indexar uma lista ou sequência vazia, receberá uma exceção. Se você quiser lidar com essa exceção, use try / except - é para isso que serve.
31418 Chris Johnson

94

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.


71

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.


2
se o tamanho da sua lista for zero, esta solução funcionará enquanto list[-1]ocorrerá um erro.
Anon01

O que? Por que você faria a[-1:][0] em tudo ? Ele fornece de a[-1]qualquer maneira também. Explicação, por favor?
Kaboom

52

No Python, como você obtém o último elemento de uma lista?

Para obter apenas o último elemento,

  • sem modificar a lista e
  • supondo que você saiba que a lista possui um último elemento (ou seja, não é vazio)

passe -1para a notação subscrita:

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

Explicação

Í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", -1faz 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'

Tarefa através da descompactação iterável

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]

Em uma função

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'

Casos especiais

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.

Fatiamento

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

  • uma nova lista criada
  • e a nova lista ficará vazia se a lista anterior estiver vazia.

for rotações

Como um recurso do Python, não há escopo interno em um forloop.

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 itemestava 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ê

  • já estão em loop e
  • você sabe que o loop terminará (não interromperá ou sairá devido a erros); caso contrário, ele apontará para o último elemento referenciado pelo loop.

Obtendo e removendo

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.poppode ser usado sem um argumento de índice):

>>> a_list.pop()
'two'

Faça isso apenas se

  • você sabe que a lista possui elementos ou está preparada para lidar com a exceção, se estiver vazia, e
  • você pretende remover o último elemento da lista, tratando-o como uma pilha.

Esses são casos de uso válidos, mas não muito comuns.

Salvando o resto do reverso para mais tarde:

Não sei por que você faria isso, mas, para completar, como reversedretorna 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

14

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'


10

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'

6

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.


2
Provavelmente é ruim assumir que mutando a lista original geralmente não é recomendado, porque, afinal de contas, é muito comumente realizadas
Aaron

6

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)

4

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 .


3
items [len (items) - 1] é essencialmente o que o Python está fazendo sob o capô, mas como o len de uma sequência já está armazenado na sequência, não há necessidade de contar, você está criando mais trabalho do que o necessário.
Dan Gayle

21
desde que você está escrevendo Python, você realmente deveria tentar ser mais Pythonic #
Michael Wu

5
@MichaelWu Não há sentido em fazer isso. Geralmente, o modo pitônico não é auto-explicativo, precisa de mais atenção onde é necessário apresentar novas pessoas para o projeto e, é claro, não funcionaria quando você tiver que mudar para outras linguagens como Java - você não pode usar conhecimentos específicos do Python. Quando você omite o caminho python quanto possível, também é muito mais fácil retornar ao projeto após meses / anos.
Radek Anuszewski

7
@Pneumokok Você faz questão de argumentar, mas eu argumentaria que a indexação de lista é uma técnica Python muito básica em comparação com os geradores. Além disso, por que se preocupar em usar algo diferente de C ou talvez javascript, se você não quiser tirar proveito das ferramentas e da sintaxe individuais de idiomas? Então você pode fazer tudo de maneira consistente, da maneira mais difícil, em todos os seus projetos.
Matthew Purdon

Embora não seja muito pitonico, acho que isso é, em alguns aspectos, melhor do que a 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.
Byron Filer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.