while true terminar for ejemplos como ciclo bucle python loops items

true - Modificación de los elementos de la lista en el ciclo(python)



while en python 3 (3)

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de modificar elementos en una lista usando un bucle for, pero me sale un error (ver a continuación). Código de muestra:

#!/usr/bin/env python # *-* coding: utf8 *-* data = [] data.append("some") data.append("example") data.append("data") data.append("here") for item in data: data[item] = "everything"

Error:

Traceback (most recent call last): File "./testy.py", line 11, in <module> data[item] = "everything" TypeError: list indices must be integers, not str

¿Hay alguna manera de resolver este problema?


Pruebe esto en su lugar:

for i in xrange(len(data)): data[i] = "everything"

El problema básico que tienes es que cuando escribes data[i] , con los data como una lista, el i debe ser un número entero, un índice numérico en la lista. Pero en el circuito

for item in data

item es lo que está en la lista, es decir, una cadena, no el índice numérico de la cosa. xrange es un iterador que produce números en lugar de los valores en la lista, por lo que puede usar eso.

Una alternativa sería

for i, _ in enumerate(data): data[i] = "everything"

La función de enumerate le da un iterador sobre las tuplas del formulario (index, item) , de modo que todo lo que necesita hacer es tomar el índice y olvidarse del ítem. No estoy seguro de que de una manera u otra ( enumerate o xrange ) sea significativamente más rápido o mejor, ya que creo que las listas almacenan su longitud en una variable para que se pueda acceder rápidamente sin contar a través de los elementos de la lista.

Sin embargo, si necesita el valor de la lista anterior para calcular el nuevo valor de la lista, la forma de enumerate será un poco más rápida porque evita que Python busque el elemento en la lista:

for i, item in enumerate(data): data[i] = func(item)

Sin embargo, este tipo de cosas se expresa mejor como una lista de comprensión.

data = [func(item) for item in data]

Cuando hagas esto, Python examinará cada elemento en los data , aplicará la función a él y construirá una nueva lista a partir de los resultados automáticamente, para que no tengas que preocuparte por poner el resultado de func(item) en el lado derecho colocar en la lista. Su ejemplo original en realidad podría expresarse como

data = ["everything" for item in data]


Se accede a los elementos de la lista por índice entero, es decir, en los data[1] == ''example'' su ejemplo data[1] == ''example'' . Es por esto que Python se queja cuando está usando una cadena como búsqueda.

Si desea encontrar un elemento en una lista por su valor, puede usar data.index("value") :

data[data.index("some")] = "something else"

Pero si solo desea recorrerlos, use enumerate() como sugirió David.


la indexación de una lista que use números enteros podría ser ineficiente. Es probable que las tiendas de Python enumeren elementos utilizando una tabla vinculada con punteros subyacentes. En este caso, para encontrar un elemento específico, python debe atravesar la lista hasta el i-ésimo elemento.

Se sugiere que usar el formato de esta manera podría ser eficiente: a [:] = [x * x para x en a]