O último da lista com Python
Python é conhecida por facilitar a escrita de códigos bonitos e pequenos. A colinha de hoje é sobre como pegar o último elemento de uma lista usando essa linguagem \o/
Vindo de outras linguagens como Java ou C para o Python é normal trazer um pouco de sotaque para os seus códigos e querer fazer algo mais ou menos assim para pegar o último elemento de uma lista:
lista = [1, 2, 3, 4, 5]
indice = len(lista) - 1
print(indice)
# 4
ultimo = lista[indice]
print(ultimo)
# 5
Usar a função de tamanho len()
para pegar o comprimento da lista e subtrair 1
para obter o índice do último elemento daquela lista. E tudo bem! Isso funciona. Porém Python apresenta um jeito mais elegante de fazer isso, veja:
ultimo = lista[-1]
print(ultimo)
# 5
Apesar de parecer isso não é mágica não! Da documentação do Python:
If i or j is negative, the index is relative to the end of sequence s:
len(s) + i
orlen(s) + j
is substituted. But note that-0
is still0
.
De uma forma mais simples o Raymond Hettinger explica nesse tweet com código:
#python tip: How to support negative indexing:
— Raymond Hettinger (@raymondh) 20 de dezembro de 2017
def __getitem__(self, i):
if i < 0:
i += len(self)
if i < 0 or i >= len(self):
raise IndexError
...
A implementação de fato é mais complexa que essa, mas o que acontece em linhas gerais: o método __getitem__
é invocado quando fazemos a chamada lista[-1]
recebendo a própria lista (self
) e o índice negativo (i
) então soma esse índice com o tamanho da lista e retornando o valor do índice atualizado. Curiosamente é o mesmo que fiz no primeiro exemplo porém já vem implementado de fábrica.
E detalhe, o mesmo pode ser feito para strings!
palavra = 'opaopa'
print(palavra[-1])
# a
Massa né? Agora é só usar índice negativo nos seus códigos também 😉
Links
- Para mais detalhes do slice de strings olhe essa Introdução informal de Python em inglês
- Referência ao caso especial de índices negativos no método
__getitem__
na documentação do Python
Agradecimentos
Mário Sérgio, Diego Ponciano e Paulo Haddad por alguns dos links nesse post!