2013-01-18 12 views
6

Na przykład:Zmienić wartości listy podczas iteracji nad nią w Pythonie?

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) 

Powyższy kod nie robi nic, ponieważ warunek ten nie jest przez odniesienie. Jaki jest właściwy sposób na zrobienie tego?

Odpowiedz

14

można użyć 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) 

Ale w ogóle, te rzeczy są trochę czystsze z funkcjami pomocniczymi i listowych:

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] 

Należy zauważyć, że to drugie rozwiązanie nie powoduje aktualizacji zjadł listę w miejscu - Innymi słowy, jeśli masz inne odniesienia do tej listy, nie będą one wpływać. Jeśli chcesz, możesz dokonać zmiany w miejscu dość łatwo za pomocą przypisania plasterek:

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

+1. Ładne jasne wyjaśnienie zarówno mutujących, jak i niemutujących alternatyw (bez pisania 3 stron tekstu, jak zwykle robię w takich przypadkach). – abarnert

+0

@abarnert - Dzięki za opinię. Zawsze jest miło, gdy ktoś, kto konsekwentnie pisze dobre odpowiedzi, pozostawia miłą nutkę :) – mgilson

1

Można użyć wyrażeń listowych:

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

Wydaje mi się, że 'mógłby update_single_condition' być staticmethod lub po prostu zwykła funkcja. W przeciwnym razie dobra odpowiedź +1. – mgilson

Powiązane problemy