HOWTO · Python

Verifique se o índice existe na lista Python

Este tutorial demonstra verificar se existe índice na lista Python usando intervalo de lista e exceção IndexError

Nesta página

Listas em Python usam indexação começando em zero, então o primeiro item fica no índice 0. Para um índice não negativo, verifique 0 <= index < len(items) antes de acessar a lista. Se você já estiver tentando obter um item, trate IndexError em torno desse acesso. Python também aceita índices contados a partir do fim da lista, então o intervalo válido completo vai de -len(items) até len(items) - 1.

Verifique um índice com um teste de limites

Use um teste de limites quando precisar validar um índice antes de acessar ou atualizar uma lista. O teste 0 <= index < len(items) inclui o primeiro índice e exclui o comprimento da lista, pois len(items) corresponde a uma posição além da última.

Execute este exemplo. Os textos e rótulos exibidos no exemplo permanecem em inglês:

items = ["Apple", "Banana", "Pineapple"]
index = 1

if 0 <= index < len(items):
    print(f"{items[index]} is at index {index}.")
else:
    print(f"No item at index {index}.")
Banana is at index 1.

Essa verificação é clara quando se espera um índice inteiro não negativo. A comparação verifica apenas o intervalo do valor; ela não confirma que ele seja um índice válido para uma lista. Por exemplo, 1.0 satisfaz 0 <= index < len(items), mas items[1.0] gera TypeError. Verifique o tipo do índice separadamente antes de considerar um resultado positivo como garantia de que o acesso funcionará. Essa verificação também não aceita índices negativos, embora o acesso a listas em Python os aceite. Se quem chama a função puder fornecer valores negativos, use o intervalo completo na função auxiliar reutilizável abaixo ou normalize o índice conforme as necessidades da sua aplicação.

A condição retorna False quando o índice está fora dos limites da lista. Este exemplo mostra os dois resultados para a mesma lista de três itens; os textos exibidos continuam em inglês:

items = ["Apple", "Banana", "Pineapple"]
for index in (1, 3):
    if 0 <= index < len(items):
        print(f"{index}: {items[index]}")
    else:
        print(f"{index}: no item")
1: Banana
3: no item

Verifique um índice capturando IndexError

Quando o objetivo é obter o item, tente acessá-lo e trate IndexError. Mantenha o bloco try restrito para que o tratamento cubra apenas a operação que pode gerar esse erro de indexação. Outros erros, como um TypeError causado por um índice que não seja inteiro, não são ocultados por esse tratamento.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

items = ["Apple", "Banana", "Pineapple"]
index = 2

try:
    item = items[index]
except IndexError:
    print("No item at that index.")
else:
    print(f"Found {item} at index {index}.")
Found Pineapple at index 2.

Esse padrão verifica o acesso e obtém o valor em uma única operação. Um teste de limites separado não garante que um acesso posterior funcionará caso outra parte do programa altere a lista entre a verificação e o uso. Quando essa possibilidade for relevante, trate o erro no próprio acesso.

Este exemplo mostra o tratamento para um índice além da última posição. A mensagem exibida permanece em inglês:

items = ["Apple", "Banana", "Pineapple"]
index = 3

try:
    item = items[index]
except IndexError:
    print(f"No item at index {index}.")
No item at index 3.

Crie uma verificação de índice reutilizável

Coloque o intervalo completo de índices da lista em uma função auxiliar quando precisar fazer a mesma verificação em vários lugares. Para uma lista de comprimento n, Python aceita índices de -n até, mas sem incluir, n.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

def index_exists(items, index):
    return -len(items) <= index < len(items)


fruits = ["Apple", "Banana", "Pineapple"]
for index in (2, -1, 3, -4):
    print(f"{index}: {index_exists(fruits, index)}")
2: True
-1: True
3: False
-4: False

A função auxiliar pressupõe um índice inteiro e verifica apenas seu intervalo, incluindo os índices negativos válidos. Um número de ponto flutuante como 1.0 pode satisfazer essa comparação, embora items[1.0] gere TypeError; verifique o tipo do índice separadamente antes de considerar True como garantia de que o acesso funcionará. Use items[index] após um resultado positivo para obter o item. Se a lista puder mudar entre a verificação e o acesso, o resultado poderá ficar desatualizado; nesse caso, use um bloco try em torno do acesso.

Trate índices negativos e inválidos

Índices negativos contam a partir do fim: -1 seleciona o último item e -len(items) seleciona o primeiro. Uma lista vazia não tem índice válido, pois seu comprimento é zero e não há número inteiro no intervalo de -0 (inclusive) até 0 (exclusive). Valores fora do intervalo válido geram IndexError quando usados para acessar uma lista.

Os índices também precisam ser inteiros. Um número de ponto flutuante como 1.0 pode satisfazer uma comparação de intervalo, mas não é um índice válido para uma lista e causa TypeError ao ser usado no acesso; uma string também não é um índice válido. Tratar apenas IndexError não resolve essas incompatibilidades de tipo. Se sua função receber dados externos ao seu código, verifique o tipo separadamente antes de confiar em um teste de limites, ou trate os erros específicos que sua interface promete aceitar. Evite converter valores arbitrários em inteiros sem decidir se o truncamento ou a conversão de texto corresponde à intenção de quem chamou a função.

Escolha a abordagem adequada

Use uma verificação de limites quando quiser tomar uma decisão antes de acessar um índice não negativo, ou use o intervalo completo de negativos a positivos quando a interface aceitar índices negativos. Use try/except IndexError quando o próprio acesso for a operação e você quiser reagir caso não haja um item naquela posição. A função auxiliar reutilizável é útil quando o mesmo teste de intervalo aparece repetidamente, mas não obtém um item nem protege um acesso posterior contra alterações na lista.

IndexError indica especificamente que um índice inteiro está fora das posições disponíveis na lista. Um índice que não seja inteiro gera TypeError; lembre-se dessa diferença ao validar dados não confiáveis. Essas abordagens permitem escolher entre verificar uma posição de antemão e tratar uma falha no momento do acesso.