Como acesso o índice em um for
loop como o seguinte?
ints = [8, 23, 45, 12, 78]
for i in ints:
print('item #{} = {}'.format(???, i))
Eu quero obter esta saída:
item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78
Quando faço um for
loop usando um loop, como faço para acessar o índice do loop, de 1 a 5 nesse caso?
Respostas:
O uso de uma variável de estado adicional, como uma variável de índice (que você normalmente usaria em linguagens como C ou PHP), é considerada não-pitônica.
A melhor opção é usar a função interna
enumerate()
, disponível no Python 2 e 3:Confira o PEP 279 para mais.
fonte
enumerate
incorre em outra sobrecarga?enumerate
.Use
enumerate
para obter o índice com o elemento conforme você itera:E observe que os índices do Python começam em zero, então você obteria 0 a 4 com o acima. Se você deseja a contagem de 1 a 5, faça o seguinte:
Fluxo de controle unidiomatic
O que você está pedindo é o equivalente Pythonic do seguinte, que é o algoritmo que a maioria dos programadores de linguagens de nível inferior usaria:
Ou em idiomas que não possuem um loop for-each:
ou às vezes mais comumente (mas unidiomaticamente) encontrado no Python:
Use a função enumerar
A
enumerate
função do Python reduz a desordem visual, ocultando a contabilidade dos índices e encapsulando o iterável em outro iterável (umenumerate
objeto) que produz uma tupla de dois itens do índice e o item que o iterável original forneceria. É assim:Esse exemplo de código é razoavelmente bem o exemplo canônico da diferença entre o código idiomático do Python e o código que não é. O código linguístico é sofisticado (mas não complicado), o Python, escrito da maneira que ele deveria ser usado. O código linguístico é esperado pelos projetistas da linguagem, o que significa que geralmente esse código não é apenas mais legível, mas também mais eficiente.
Obtendo uma contagem
Mesmo que você não precise de índices à medida que avança, mas precisa de uma contagem das iterações (às vezes desejáveis) com as quais pode começar
1
e o número final será sua contagem.A contagem parece ser mais o que você pretende solicitar (em oposição ao índice) quando disse que queria de 1 a 5.
Quebrando-o - uma explicação passo a passo
Para detalhar esses exemplos, digamos que temos uma lista de itens que queremos iterar com um índice:
Agora passamos esse iterável para enumerar, criando um objeto enumerado:
Podemos extrair o primeiro item dessa iterável que entraríamos em loop com a
next
função:E vemos que obtemos uma tupla do
0
primeiro índice e'a'
do primeiro item:podemos usar o que é chamado de " descompactação de sequência " para extrair os elementos dessa duas tuplas:
e quando inspecionamos
index
, descobrimos que ele se refere ao primeiro índice, 0, eitem
ao primeiro item'a'
,.Conclusão
Então faça o seguinte:
fonte
items
está vazio?[1406, 1409]
. Se eu imprimir no console usandoprint(legData)
, a saída será [1406,1409] . No entanto, se eu tentar analisar os valores individuais da lista comofor idx, xLeg in enumerate(legData):
print(idx, xLeg)
, obtém-me uma saída de números inteiros individuais como [, 1, 4, 0, 6 e assim por diante em relação aos índices 0, 1, 2, 3, 4 etc. (sim, os colchetes e a vírgula também estão sendo exibidos como se fossem parte dos dados ). o que há de errado aqui?É muito simples iniciá-lo a partir
1
de0
:Nota
Dica importante, embora um pouco enganosa, pois
index
será umtuple
(idx, item)
aqui. Bom para ir.fonte
index, item
apenasindex
é muito enganador, como você observou. Basta usarfor index, item in enumerate(ints)
.fonte
xrange
para o pré-3.0.enumerate
salva qualquer lógica; você ainda precisa selecionar com qual objeto indexari
, não?Como é a norma em Python, existem várias maneiras de fazer isso. Em todos os exemplos, assuma:
lst = [1, 2, 3, 4, 5]
1. Usando enumerar ( considerado mais idiomático )
Essa também é a opção mais segura na minha opinião, porque a chance de entrar em uma recursão infinita foi eliminada. O item e seu índice são mantidos em variáveis e não há necessidade de escrever nenhum código adicional para acessar o item.
2. Criando uma variável para manter o índice ( usando
for
)3. Criando uma variável para manter o índice ( usando
while
)4. Sempre há outra maneira
Como explicado anteriormente, existem outras maneiras de fazer isso que não foram explicadas aqui e podem até se aplicar mais em outras situações. por exemplo, usando
itertools.chain
com for. Ele lida com loops aninhados melhor do que os outros exemplos.fonte
Do modo antigo:
Compreensão da lista:
fonte
A maneira mais rápida de acessar índices de lista dentro de loop no Python 2.7 é usar o método range para pequenas listas e enumerar o método para listas de tamanho médio e grande.
Consulte as diferentes abordagens que podem ser usadas para iterar sobre a lista e acessar o valor do índice e suas métricas de desempenho (que eu acho que seriam úteis para você) nos exemplos de código abaixo:
Veja métricas de desempenho para cada método abaixo:
Como resultado, usar
range
método é o mais rápido da lista, com 1000 itens. Para lista com tamanho> 10 000 itensenumerate
é o vencedor.Adicionando alguns links úteis abaixo:
Qual é a diferença entre as funções range e xrange no Python 2.X?
O que é mais rápido para loop usando enumerar ou para loop usando xrange em Python?
intervalo (len (lista)) ou enumerar (lista)?
fonte
Primeiro, os índices serão de 0 a 4. Os idiomas de programação começam a contar de 0; não esqueça disso ou você encontrará uma exceção fora dos limites. Tudo o que você precisa no loop for é uma variável contando de 0 a 4 da seguinte forma:
Lembre-se de que eu escrevi de 0 a 5 porque o loop para um número antes do máximo. :)
Para obter o valor de um índice, use
fonte
Aqui está o que você obtém ao acessar o índice em
for
loops:Resultado:
Resultado:
Resultado:
fonte
De acordo com esta discussão: http://bytes.com/topic/python/answers/464012-objects-list-index
Iteração de contador de loop
O idioma atual para fazer um loop sobre os índices faz uso da
range
função interna:O loop sobre elementos e índices pode ser alcançado pelo idioma antigo ou usando a nova
zip
função interna:ou
via http://www.python.org/dev/peps/pep-0212/
fonte
Você pode fazer isso com este código:
Use este código se precisar redefinir o valor do índice no final do loop:
fonte
A melhor solução para esse problema é usar a função enumerar python embutida.
enumerar retorno tupla
primeiro valor é índice
segundo valor é elemento da matriz nesse índice
fonte
Na sua pergunta, você escreve "como faço para acessar o índice do loop, de 1 a 5 neste caso?"
No entanto, o índice para uma lista é executado a partir de zero. Portanto, precisamos saber se o que você realmente deseja é o índice e o item para cada item em uma lista, ou se você realmente deseja números começando de 1. Felizmente, no Python, é fácil fazer um ou ambos.
Primeiro, para esclarecer, a
enumerate
função retorna iterativamente o índice e o item correspondente para cada item em uma lista.A saída para o acima é então,
Observe que o índice é executado a partir de 0. Esse tipo de indexação é comum entre as linguagens de programação modernas, incluindo Python e C.
Se você deseja que seu loop abranja uma parte da lista, você pode usar a sintaxe padrão do Python para uma parte da lista. Por exemplo, para fazer um loop do segundo item em uma lista até o último item, mas não incluindo, você pode usar
Observe que mais uma vez, o índice de saída é executado de 0,
Isso nos leva à
start=n
mudança paraenumerate()
. Isso simplesmente compensa o índice; você pode simplesmente adicionar um número ao índice dentro do loop.para o qual a saída é
fonte
Se eu fosse iterar
nums = [1, 2, 3, 4, 5]
eu fariaOu obtenha o comprimento como
l = len(nums)
fonte
Se não houver valor duplicado na lista:
fonte
enumerate
. Você deve excluir esta resposta.Você também pode tentar o seguinte:
A saída é
fonte
Você pode usar o
index
métodoEdição Destacado no comentário que este método não funciona se houver duplicatas
ints
, o método abaixo deve funcionar para quaisquer valores emints
:Ou alternativamente
se você deseja obter o índice e o valor em
ints
como uma lista de tuplas.Ele usa o método de
enumerate
na resposta selecionada para esta pergunta, mas com compreensão de lista, tornando-o mais rápido com menos código.fonte
Resposta simples usando o Loop While:
Resultado:
fonte
Para imprimir tupla de (índice, valor) na compreensão da lista usando um
for
loop:Resultado:
fonte
Isso serve bem a esse propósito:
fonte
index()
a primeira ocorrência será pesquisadax
, sem mencionar o tempo O ( n ^ 2 ) necessário para pesquisar cada elemento.