¿Cómo acceder al valor del índice en un bucle 'for'?

Resuelto Joan Venge asked hace 15 años • 28 respuestas

¿Cómo accedo al índice mientras itero sobre una secuencia con un forbucle?

xs = [8, 23, 45]

for x in xs:
    print("item #{} = {}".format(index, x))

Salida deseada:

item #1 = 8
item #2 = 23
item #3 = 45
Joan Venge avatar Feb 07 '09 05:02 Joan Venge
Aceptado

Utilice la función incorporada enumerate():

for idx, x in enumerate(xs):
    print(idx, x)

No es pitónico indexar manualmente for i in range(len(xs)): x = xs[i]o administrar manualmente una variable de estado adicional.

Consulte PEP 279 para obtener más información.

Mike Hordecki avatar Feb 06 '2009 22:02 Mike Hordecki

Usando un bucle for, ¿cómo accedo al índice del bucle, del 1 al 5 en este caso?

Úselo enumeratepara obtener el índice con el elemento a medida que itera:

for index, item in enumerate(items):
    print(index, item)

Y tenga en cuenta que los índices de Python comienzan en cero, por lo que obtendría de 0 a 4 con lo anterior. Si quieres contar del 1 al 5, haz esto:

count = 0 # in case items is empty and you need it after the loop
for count, item in enumerate(items, start=1):
    print(count, item)

Flujo de control unidiomático

Lo que estás pidiendo es el equivalente Pythonic de lo siguiente, que es el algoritmo que usarían la mayoría de los programadores de lenguajes de nivel inferior:

index = 0            # Python's indexing starts at zero
for item in items:   # Python's for loops are a "for each" loop 
    print(index, item)
    index += 1

O en idiomas que no tienen un bucle para cada:

index = 0
while index < len(items):
    print(index, items[index])
    index += 1

o a veces se encuentra más comúnmente (pero de forma unidiomática) en Python:

for index in range(len(items)):
    print(index, items[index])

Utilice la función de enumerar

enumerateLa función de Python reduce el desorden visual al ocultar la contabilidad de los índices y encapsular el iterable en otro iterable (un enumerateobjeto) que produce una tupla de dos elementos del índice y el elemento que proporcionaría el iterable original. Eso se parece a esto:

for index, item in enumerate(items, start=0):   # default is zero
    print(index, item)

Este ejemplo de código es bastante bien el ejemplo canónico de la diferencia entre código que es idiomático de Python y código que no lo es. El código idiomático es Python sofisticado (pero no complicado), escrito en la forma en que fue diseñado para ser utilizado. Los diseñadores del lenguaje esperan el código idiomático, lo que significa que normalmente este código no sólo es más legible, sino también más eficiente.

Obtener un conteo

Incluso si no necesita índices a medida que avanza, necesita un recuento de las iteraciones (a veces deseables) con las que puede comenzar 1y el número final será su recuento.

count = 0 # in case items is empty
for count, item in enumerate(items, start=1):   # default is zero
    print(item)

print('there were {0} items printed'.format(count))

El recuento parece ser más lo que pretendes pedir (a diferencia del índice) cuando dijiste que querías del 1 al 5.


Desglosándolo: una explicación paso a paso

Para desglosar estos ejemplos, digamos que tenemos una lista de elementos sobre los que queremos iterar con un índice:

items = ['a', 'b', 'c', 'd', 'e']

Ahora pasamos este iterable para enumerar, creando un objeto de enumeración:

enumerate_object = enumerate(items) # the enumerate object

Podemos extraer el primer elemento de este iterable que incluiríamos en un bucle con la nextfunción:

iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)

Y vemos que obtenemos una tupla de 0, el primer índice, y 'a', el primer elemento:

(0, 'a')

Podemos usar lo que se conoce como " desempaquetado de secuencia " para extraer los elementos de esta doble tupla:

index, item = iteration
#   0,  'a' = (0, 'a') # essentially this.

y cuando inspeccionamos index, encontramos que se refiere al primer índice, 0, y itemse refiere al primer elemento 'a',.

>>> print(index)
0
>>> print(item)
a

Conclusión

  • Los índices de Python comienzan en cero
  • Para obtener estos índices de un iterable a medida que lo itera, use la función enumerar
  • El uso de enumerar de forma idiomática (junto con el desempaquetado de tuplas) crea un código que es más legible y fácil de mantener:

Entonces haz esto:

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)
Russia Must Remove Putin avatar Jan 21 '2015 17:01 Russia Must Remove Putin

Es bastante sencillo comenzar desde 1otro lugar que no sea 0:

for index, item in enumerate(iterable, start=1):
   print index, item  # Used to print in python<3.x
   print(index, item) # Migrate to print() after 3.x+
   
A.J. avatar May 27 '2014 10:05 A.J.