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
enumerate(tasks, start=1)emparelha cada tarefa com sua posição.start=1torna os números amigáveis.- 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.