¿Cómo acceder al valor del índice en un bucle 'for'?
¿Cómo accedo al índice mientras itero sobre una secuencia con un for
bucle?
xs = [8, 23, 45]
for x in xs:
print("item #{} = {}".format(index, x))
Salida deseada:
item #1 = 8
item #2 = 23
item #3 = 45
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.
Usando un bucle for, ¿cómo accedo al índice del bucle, del 1 al 5 en este caso?
Úselo enumerate
para 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
enumerate
La función de Python reduce el desorden visual al ocultar la contabilidad de los índices y encapsular el iterable en otro iterable (un enumerate
objeto) 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 1
y 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 next
funció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 item
se 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)
Es bastante sencillo comenzar desde 1
otro 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+