Usando un bucle for, ¿cómo accedo al índice del bucle, de 1 a 5 en este caso?
Use 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 0 a 4 con lo anterior. Si desea el recuento del 1 al 5, haga esto:
for count, item in enumerate(items, start=1):
print(count, item)
Flujo de control unidiomático
Lo que está pidiendo es el equivalente pitónico 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 ciclo for-each:
index = 0
while index < len(items):
print(index, items[index])
index += 1
o a veces más comúnmente (pero unidiomáticamente) encontrado en Python:
for index in range(len(items)):
print(index, items[index])
Use la función Enumerar
La enumerate
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 ve así:
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 el código que es idiomático de Python y el código que no lo es. El código idiomático es Python sofisticado (pero no complicado), escrito de la manera en que estaba destinado a ser utilizado. Los diseñadores del lenguaje esperan un código idiomático, lo que significa que generalmente este código no solo es más legible, sino también más eficiente.
Obtener un conteo
Incluso si no necesita índices a medida que avanza, pero necesita un recuento de las iteraciones (a veces deseable) con las que puede comenzar 1
y el número final será su recuento.
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 de lo que pretendes pedir (en lugar 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 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 obtendrí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 del 0
primer índice y 'a'
del primer elemento:
(0, 'a')
podemos usar lo que se conoce como " desempaquetado de secuencia " para extraer los elementos de esta tupla doble:
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 punto, '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 itera sobre él, use la función de enumeración
- El uso de enumerar de forma idiomática (junto con el desempaquetado de tuplas) crea un código que es más legible y mantenible:
Entonces haz esto:
for index, item in enumerate(items, start=0): # Python indexes start at zero
print(index, item)