¿Modificar los valores de una lista mientras se itera sobre ella en Python?

Por ejemplo:

def update_condition(self, type, params): for condition in self.conditions: condition_loaded = json.loads(condition) if condition_loaded['type'] == type: condition_loaded['params'] = params condition = json.dumps(condition_loaded) 

El código anterior no hace nada porque la condición no es por referencia. ¿Cuál es la forma correcta de hacer esto?

Podrías usar enumerate :

 def update_condition(self, type, params): for i,condition in enumerate(self.conditions): condition_loaded = json.loads(condition) if condition_loaded['type'] == type: condition_loaded['params'] = params self.conditions[i] = json.dumps(condition_loaded) 

Pero, en general, estas cosas son un poco más limpias con funciones de ayuda y listas de comprensión:

 def helper(condition,type,params) loaded = json.loads(condition) if loaded['type'] == type: loaded['params'] = params return json.dumps(loaded) return condition ... def update_condition(self, type, params): self.conditions = [helper(c,type,params) for c in self.conditions] 

Debe tenerse en cuenta que esta segunda solución no actualiza la lista en su lugar. En otras palabras, si tiene otras referencias a esta lista, no se verán afectadas. Si lo desea, puede realizar la sustitución en el lugar con bastante facilidad utilizando la asignación de sector:

 def update_condition(self, type, params): self.conditions[:] = [helper(c,type,params) for c in self.conditions] 

Podrías usar una lista de comprensión:

 def update_single_condition(self, condition, type, params): condition_loaded = json.loads(condition) if condition_loaded['type'] == type: condition_loaded['params'] = params return json.dumps(condition_loaded) def update_conditions(self, type, params): self.conditions = [self.update_single_condition(c, type, params) for c in self.conditions]