2013-01-18 13 views
6

Ad esempio:Modificare i valori di un elenco mentre si esegue il iter su di esso in Python?

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) 

Il codice precedente non fa nulla perché condizione non è per riferimento. Qual è il modo corretto per farlo?

risposta

14

Si potrebbe utilizzare 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) 

Ma, in generale, queste cose sono un po 'più pulito, con funzioni di supporto e list comprehension:

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] 

Va notato che questa seconda soluzione non aggiorna mangiato la lista in atto - In altre parole, se hai altri riferimenti a questa lista, non saranno influenzati. Se si desidera, è possibile effettuare la sostituzione in posizione abbastanza facilmente usando assegnamento di una fetta:

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

+1. Bella chiara spiegazione sia delle alternative mutanti che non mutanti (senza scrivere 3 pagine di testo come di solito finisco per fare in questi casi). – abarnert

+0

@abarnert - Grazie per il feedback. È sempre bello quando qualcuno che scrive costantemente buone risposte lascia una bella nota :) – mgilson

1

Si potrebbe utilizzare una lista di comprensione:

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] 
+0

Mi sembra che 'update_single_condition' potrebbe essere uno staticmethod o semplicemente una normale funzione. Altrimenti, buona risposta +1. – mgilson

Problemi correlati