Python enumera para pares de índice e valor

Python enumerate adiciona um índice em execução a um iterável, retornando pares (index, value) conforme você faz o loop. Use-o quando precisar da posição de cada item, como saída numerada ou rótulos. É o padrão integrado para emparelhar cada item com sua posição em listas, geradores ou linhas de arquivo.

Exemplo de enumeração de Python para saída numerada

Saída:

A saída aparecerá aqui...

Saída:

1. ship order
2. email customer

Como este exemplo funciona

  1. enumerate(tasks, start=1) emparelha cada tarefa com sua posição.
  2. start=1 torna os números amigáveis.
  3. A saída mostra cada tarefa rotulada com seu número.

Armadilhas comuns com enumeração de Python

Erro 1: esquecer que a numeração começa em 0.

for line_no, row in enumerate(rows):
    print(f"Line {line_no}: {row['sku']}")
for line_no, row in enumerate(rows, start=1):
    print(f"Line {line_no}: {row['sku']}")

Por que isso acontece: o padrão enumerate é 0, o que é correto para índices baseados em zero, mas confuso para números de linha voltados para humanos.

Erro 2: enumerar um dicionário e esperar valores.

region_totals = {"west": 1200, "east": 980}
for i, total in enumerate(region_totals):
    print(i, total)
region_totals = {"west": 1200, "east": 980}
for i, (region, total) in enumerate(region_totals.items(), start=1):
    print(i, region, total)

Por que isso acontece: iterar um dict produz chaves, então enumerate emparelha índices com chaves, a menos que você faça um loop sobre .items(). Se você quiser padrões de pesquisa de chave/valor, consulte o [exemplo de ditado Python] (/pt/examples/python/python-dict-example).

Erro 3: Construir list(enumerate(...)) para grandes volumes de dados.

indexed_rows = list(enumerate(rows, start=1))
for line_no, row in indexed_rows:
    print(line_no, row)
for line_no, row in enumerate(rows, start=1):
    print(line_no, row)

Por que isso acontece: list() força todos os pares na memória, enquanto enumerate já é preguiçoso e pode transmitir linhas.

enumerar vs range(len()): qual usar

Use enumerate quando…Use range(len()) quando…
Você precisa do índice e do item juntos.Você só precisa de índices numéricos.
Você está iterando qualquer iterável, incluindo geradores.Você deve pular pelas etapas personalizadas ou iterar apenas pelo índice.
Você deseja loops legíveis sem indexação manual.Você está trabalhando com índices para fatiamento ou acesso aleatório.

Regra prática: procure enumerate para índice + valor; use range(len()) quando o índice em si for a principal coisa que você precisa. Se você precisar apenas de matemática de índice, o exemplo de intervalo Python vai mais fundo.

Considerações de desempenho

enumerate é O(n) e preguiçoso, portanto não aloca uma lista extra de pares, a menos que você a envolva com list(). Na prática, é mais rápido e claro do que chamar list.index() dentro de um loop (o que pode tornar o loop O(n^2)). Se você precisar apenas rotular linhas, enumerate mantém a memória plana e ainda fornece números de linha.

Outros casos de uso para enumerar

Sinalize linhas de erro ao verificar registros.

lines = [
    "INFO connected",
    "ERROR timeout",
    "INFO retry",
]

for line_no, line in enumerate(lines, start=1):
    if "ERROR" in line:
        print(f"Line {line_no}: {line}")

Isso mantém o número exato da linha anexado a cada erro, o que acelera a depuração e a revisão de incidentes. Funciona da mesma maneira para arquivos porque enumerate aceita qualquer iterável.

Normalize uma lista por índice.

names = ["  ada", "grace ", "  linus"]
for i, name in enumerate(names):
    # Update by index when you need to mutate the list in place.
    names[i] = name.strip().title()

print(names)

Isso mantém os dados na mesma lista e ainda fornece o índice que você precisa atribuir de volta. É mais claro do que gerenciar um contador manual e mantém o loop legível.