¿Cómo accedo al índice en un for
bucle como el siguiente?
ints = [8, 23, 45, 12, 78]
for i in ints:
print('item #{} = {}'.format(???, i))
Quiero obtener esta salida:
item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78
Cuando lo recorro usando un for
bucle, ¿cómo accedo al índice del bucle, de 1 a 5 en este caso?
Respuestas:
El uso de una variable de estado adicional, como una variable de índice (que normalmente usaría en lenguajes como C o PHP), se considera no pitónico.
La mejor opción es utilizar la función integrada
enumerate()
, disponible en Python 2 y 3:Echa un vistazo a PEP 279 para más.
fuente
enumerate
No incurre en otra sobrecarga?enumerate
.Use
enumerate
para obtener el índice con el elemento a medida que itera: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:
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:
O en idiomas que no tienen un ciclo for-each:
o a veces más comúnmente (pero unidiomáticamente) encontrado en Python:
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 (unenumerate
objeto) que produce una tupla de dos elementos del índice y el elemento que proporcionaría el iterable original. Eso se ve así: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.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:
Ahora pasamos este iterable para enumerar, creando un objeto de enumeración:
Podemos extraer el primer elemento de este iterable que obtendríamos en un bucle con la
next
función:Y vemos que obtenemos una tupla del
0
primer índice y'a'
del primer elemento:podemos usar lo que se conoce como " desempaquetado de secuencia " para extraer los elementos de esta tupla doble:
y cuando inspeccionamos
index
, encontramos que se refiere al primer índice, 0, yitem
se refiere al primer punto,'a'
.Conclusión
Entonces haz esto:
fuente
items
está vacío?[1406, 1409]
. Si imprimo en la consola usandoprint(legData)
, la salida es [1406,1409] . Sin embargo, si trato de analizar los valores individuales de la lista comofor idx, xLeg in enumerate(legData):
print(idx, xLeg)
, me da una salida de enteros individuales como [, 1, 4, 0, 6, y así sucesivamente contra los índices 0, 1, 2, 3, 4 etc. (sí, los corchetes y la coma también se muestran como si fueran parte de los datos ). ¿Qué está mal aquí?Es bastante simple iniciarlo desde
1
otro que no sea0
:Nota
Sugerencia importante, aunque un poco engañosa ya
index
que será untuple
(idx, item)
aquí. Bueno para ir.fuente
index, item
justindex
es muy engañoso, como notó. Solo úsalofor index, item in enumerate(ints)
.fuente
xrange
para pre-3.0.enumerate
guarda ninguna lógica; todavía tiene que seleccionar con qué objeto indexari
, ¿no?Como es la norma en Python, hay varias formas de hacerlo. En todos los ejemplos, suponga:
lst = [1, 2, 3, 4, 5]
1. Usando enumerate ( considerado el más idiomático )
Esta es también la opción más segura en mi opinión porque se ha eliminado la posibilidad de entrar en una recursión infinita. Tanto el elemento como su índice se mantienen en variables y no hay necesidad de escribir ningún código adicional para acceder al elemento.
2. Crear una variable para contener el índice ( usando
for
)3. Crear una variable para contener el índice ( usando
while
)4. Siempre hay otra forma
Como se explicó anteriormente, hay otras formas de hacer esto que no se han explicado aquí e incluso pueden aplicarse más en otras situaciones. por ejemplo, usar
itertools.chain
con for. Maneja los bucles anidados mejor que los otros ejemplos.fuente
De forma anticuada:
Lista de comprensión:
fuente
La forma más rápida de acceder a los índices de la lista dentro del bucle en Python 2.7 es usar el método de rango para listas pequeñas y el método de enumeración para listas de tamaño medio y grande.
Vea los diferentes enfoques que se pueden usar para iterar sobre el valor de la lista y el índice de acceso y sus métricas de rendimiento (que supongo que serían útiles para usted) en los ejemplos de código a continuación:
Consulte las métricas de rendimiento para cada método a continuación:
Como resultado, usar el
range
método es el más rápido hasta la lista con 1000 elementos. Para la lista con tamaño> 10 000 artículosenumerate
es el ganador.Agregando algunos enlaces útiles a continuación:
¿Cuál es la diferencia entre las funciones de rango y xrange en Python 2.X?
¿Qué es más rápido para loop usando enumerate o para loop usando xrange en Python?
rango (len (lista)) o enumerar (lista)?
fuente
En primer lugar, los índices serán de 0 a 4. Los lenguajes de programación comienzan a contar desde 0; no lo olvide o encontrará una excepción de índice fuera de límites. Todo lo que necesita en el bucle for es un recuento variable de 0 a 4, así:
Tenga en cuenta que escribí 0 a 5 porque el ciclo se detiene un número antes del máximo. :)
Para obtener el valor de un índice use
fuente
Esto es lo que obtienes cuando accedes al índice en
for
bucles:Resultado:
Resultado:
Resultado:
fuente
De acuerdo con esta discusión: http://bytes.com/topic/python/answers/464012-objects-list-index
Iteración de contador de bucle
El idioma actual para recorrer los índices hace uso de la
range
función incorporada:El bucle sobre ambos elementos e índices puede lograrse ya sea por el viejo idioma o mediante el uso de la nueva
zip
función incorporada:o
a través de http://www.python.org/dev/peps/pep-0212/
fuente
Puedes hacerlo con este código:
Use este código si necesita restablecer el valor del índice al final del ciclo:
fuente
La mejor solución para este problema es utilizar la función enumerar Python incorporada.
enumerar retorno tupla
primer valor es índice
segundo valor es elemento de la matriz en ese índice
fuente
En su pregunta, escribe "¿cómo accedo al índice de bucle, de 1 a 5 en este caso?"
Sin embargo, el índice de una lista se ejecuta desde cero. Entonces, debemos saber si lo que realmente desea es el índice y el elemento para cada elemento de una lista, o si realmente desea números que comiencen desde 1. Afortunadamente, en Python, es fácil hacer uno o ambos.
Primero, para aclarar, la
enumerate
función devuelve iterativamente el índice y el elemento correspondiente para cada elemento en una lista.La salida para lo anterior es entonces,
Observe que el índice se ejecuta desde 0. Este tipo de indexación es común entre los lenguajes de programación modernos, incluidos Python y C.
Si desea que su ciclo abarque una parte de la lista, puede usar la sintaxis estándar de Python para una parte de la lista. Por ejemplo, para recorrer desde el segundo elemento de una lista hasta el último elemento, pero sin incluirlo, puede usar
Tenga en cuenta que, una vez más, el índice de salida se ejecuta desde 0,
Eso nos lleva al
start=n
cambio deenumerate()
. Esto simplemente compensa el índice, de manera equivalente puede simplemente agregar un número al índice dentro del bucle.para el cual la salida es
fuente
Si
nums = [1, 2, 3, 4, 5]
tuviera que repetir , lo haríaO obtener la longitud como
l = len(nums)
fuente
Si no hay un valor duplicado en la lista:
fuente
enumerate
. Deberías eliminar esta respuesta.También puedes probar esto:
La salida es
fuente
Puedes usar el
index
métodoEDITAR Destacado en el comentario de que este método no funciona si hay duplicados
ints
, el siguiente método debería funcionar para cualquier valor enints
:O alternativamente
si desea obtener tanto el índice como el valor
ints
como una lista de tuplas.Utiliza el método de
enumerate
en la respuesta seleccionada a esta pregunta, pero con comprensión de la lista, lo que lo hace más rápido con menos código.fuente
Respuesta simple usando el bucle While:
Salida:
fuente
Para imprimir la tupla de (índice, valor) en la comprensión de la lista usando un
for
bucle:Salida:
fuente
Esto sirve el propósito lo suficientemente bien:
fuente
index()
que buscará la primera aparición dex
, sin mencionar el tiempo O ( n ^ 2 ) requerido para buscar cada elemento.